之前看了大神博客,感觉记住一幅画就能记得这个算法。。。
17.12.8 看图记不住。看代码
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 //#include<iostream> 5 using namespace std; 6 7 int n; 8 #define maxn 233333 9 char s[maxn];int p[maxn]; 10 int main() 11 { 12 scanf("%s",s);n=strlen(s); 13 for (int i=n;i>=0;i--) 14 { 15 s[(i<<1)+2]=s[i]; 16 s[(i<<1)+1]=' '; 17 } 18 s[0]='#';n=(n<<1)+1; 19 int id=0,ans=0;p[0]=0; 20 for (int i=1;i<=n;i++) 21 { 22 if (p[id]+id>i) p[i]=min(p[2*id-i],p[id]+id-i);//1、2 23 else p[i]=1; 24 while (i+p[i]<=n && i-p[i]>0 && s[i+p[i]]==s[i-p[i]]) p[i]++;//3 25 if (p[id]+id<p[i]+i) id=i; 26 ans=max(ans,p[i]); 27 } 28 ans--; 29 printf("%d ",ans); 30 return 0; 31 }