manacher模板

之前看了大神博客,感觉记住一幅画就能记得这个算法。。。

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 }
View Code
原文地址:https://www.cnblogs.com/Blue233333/p/7232294.html