manacher太水了。
这篇blog不能称作算法学习,因为根本没有介绍……
就贴个模板,太简单了……
1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 1000005 4 char str[MAXN]; 5 int n,str2[MAXN<<1],p[MAXN<<1]; 6 int main(){ 7 scanf("%s",str+1); n=strlen(str+1); 8 memset(str2,-1,sizeof str2); 9 for(int i=1;i<=n;++i) 10 str2[i<<1]=str[i]; 11 n=n<<1|1; 12 int mpi=2; p[1]=1; p[2]=2; 13 for(int i=3,j;i<=n;++i){ 14 j=(mpi<<1)-i; 15 if(j-p[j]<=mpi-p[mpi]){ 16 p[i]=mpi+p[mpi]-i; 17 while(0<i-p[i]&&i+p[i]<=n&&str2[i-p[i]]==str2[i+p[i]]) ++p[i]; 18 mpi=i; 19 } 20 else p[i]=p[j]; 21 } 22 for(int i=1;i<=n;++i) printf("%d ",str2[i]); puts(""); 23 for(int i=1;i<=n;++i) printf("%d ",p[i]); puts(""); 24 return 0; 25 }