给出一个只由小写英文字符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
",ans);
39 }
40 return 0;
41 }