【算法学习】manacher

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 }

 

posted @ 2018-01-27 15:16  粉兔  阅读(287)  评论(3编辑  收藏  举报