给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等

 

manacher裸题

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int maxn=11e4+5;
 7 char s[maxn],t[maxn<<1];
 8 int p[maxn<<1];
 9 
10 void manacher(){
11     int len=strlen(s),l=0;
12     t[l++]='$';
13     t[l++]='#';
14     for(int i=0;i<len;++i){
15         t[l++]=s[i];
16         t[l++]='#';
17     }
18     t[l]=0;
19     int maxx=0,num=0;
20     for(int i=0;i<l;++i){
21         p[i]=maxx>i?min(p[2*num-i],maxx-i):1;
22         while(t[i+p[i]]==t[i-p[i]])p[i]++;
23         if(i+p[i]>maxx){
24             maxx=i+p[i];
25             num=i;
26         }
27     }
28 }
29 
30 int main(){
31     while(scanf("%s",s)!=EOF){
32         manacher();
33         int l=strlen(s);
34         int ans=0;
35         for(int i=0;i<2*l+2;++i){
36             if(p[i]-1>ans)ans=p[i]-1;
37         }
38         printf("%d\n",ans);
39     }
40     return 0;
41 }
View Code