点击这里查看原题
先做一遍Manacher求出每个位置的回文串长度,然后暴力枚举第二个串的位置,为了优化,只找比答案更优的。
/*
User:Small
Language:C++
Problem No.:5371
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=2e5+5;
int a[M],rl[M],mx,pos,n,ans;
void init(){
mx=pos=ans=0;
}
void solve(){
init();
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=n;i;i--){
a[2*i]=a[i];
a[2*i-1]=-1;
}
a[2*n+1]=-1;a[0]=-2;
a[2*n+2]=-3;
n=2*n+2;
for(int i=1;i<n;i++){
if(i<mx) rl[i]=min(mx-i,rl[2*pos-i]);
else rl[i]=1;
while(a[i-rl[i]]==a[i+rl[i]]) rl[i]++;
if(mx<i+rl[i]-1){
mx=i+rl[i]-1;
pos=i;
}
}
for(int i=3;i<n;i+=2)
for(int j=rl[i];j>ans;j-=2)
if(rl[i+j-1]>=j) ans=max(ans,j);
ans=(ans-1)/2*3;
cout<<ans<<endl;
}
int main(){
freopen("data.in","r",stdin);//
ios::sync_with_stdio(false);
int t;
cin>>t;
for(int i=1;i<=t;i++){
cout<<"Case #"<<i<<": ";
solve();
}
return 0;
}