📝 核心思路

考虑回文串,单个数也是一个回文串
所以不管数字怎么排列,都能保证mex>=1,那我们只要考虑有没有mex大于1的回文串,那也就是考虑0的位置
因为有两个0,我们考虑三种情况:
1.0作为中心,双指针从两边出去,找回文串 因为有两个0 所以这有两种情况
2.两个0作为一对,首先保证两个0 之间的数是回文串,然后双指针从两边出去找回文串。


代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve(){
    int n;
    cin>>n;
    vector<int> a(2*n);
    int pos1=-1;
    int pos2=-1;
    for(int i=0;i<2*n;i++){
        cin>>a[i];
        if(a[i]==0){
            if(pos1==-1) pos1=i;
            else pos2=i;
        }
    }

    vector<bool> vis(n+1,false);
    vis[0]=true;
    int ans=1;
    
    // 0作为中心;
    int l=pos1-1,r=pos1+1;
    int mex=1;
    while(l>=0 && r<2*n && a[l]==a[r]){
        vis[a[l]]=true;
        while(vis[mex]) mex++;
        l--;
        r++;
    }
    ans=max(ans,mex);

    vis.assign(n+1,false);
    l=pos2-1,r=pos2+1;
    mex=1;
    while(l>=0 && r<2*n && a[l]==a[r]){
        vis[a[l]]=true;
        while(vis[mex]) mex++;
        l--;
        r++;
    }
    ans=max(ans,mex);

    // 0作为一对
    vis.assign(n+1,false);
    mex-1;
    l=pos1+1,r=pos2-1;
    bool T=true;
    while(l<pos2 && r>pos1){
        if(a[l]!=a[r]){
            T=false;
            break;
        }
        vis[a[l]]=true;
        l++;
        r--;
    }
    if(T){
        while(vis[mex]) mex++;
        l=pos1-1;
        r=pos2+1;
        while(l>=0 && r<2*n && a[l]==a[r]){
            vis[a[l]]=true;
            while(vis[mex]) mex++;
            l--;
            r++;
        }
    }
    ans=max(ans,mex);
    cout<<ans<<"\n";
}


int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int ttt=1;
    cin>>ttt;
    while(ttt--){
        solve();
    }   
    //solve();
    return 0;
}