(其实还是回文自动机好用,毛子真是牛逼)
Manacher
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 using namespace std; 6 char s[100001]; 7 int manacher(char s[]){ 8 int maxn=0,p[200001],mx=0,id=0,len=strlen(s); 9 char st[200001]; 10 st[0]='$'; 11 for(int i=0;i<len;i++){ 12 st[i*2+1]='#'; 13 st[(i+1)*2]=s[i]; 14 } 15 st[len*2+1]='#'; 16 for(int i=0;i<2*len;i++){ 17 if(i<mx)p[i]=min(p[id*2-i],mx-i); 18 else p[i]=1; 19 while(st[i-p[i]]==st[i+p[i]])p[i]++; 20 if(i+p[i]>mx){ 21 mx=i+p[i]; 22 id=i; 23 } 24 maxn=max(maxn,p[i]-1); 25 } 26 return maxn; 27 } 28 int main(){ 29 scanf("%s",s); 30 printf("%d",manacher(s)); 31 return 0; 32 }
毕竟是线性算法,又好背,尊重一下人家咯~