BZOJ2342: [Shoi2011]双倍回文
对每个可能成为本质不同回文子串的串判一下就好了,复杂度$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); }