对每个可能成为本质不同回文子串的串判一下就好了,复杂度$O(n)$。
#include<cstdio>
const int N=5e5+5;
int n,s,f[N];
char z[N];
int main(){
scanf("%d ",&n);
fread(z+1,1,n,stdin);
z[0]='^';
for(int i=1,j=0;i<=n;++i){
int k=j+f[j];
if(i<k&&f[j*2-i]<k-i)
f[i]=f[j*2-i];
else{
f[j=i]=i<k?k-i:0;
while(z[i-f[i]]==z[i+f[i]+1]){
int l=++f[i]/2;
if(l>s&&f[i-l]>=l)s=l;
}
}
}
printf("%d\n",s*4);
}