Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S,两组case之间由空行隔开(该空行不用处理),字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3
#include<cstdio> #include<iostream> #include<cstring> #define M 220010 using namespace std; char s,s1[M],s2[M]; int n,p[M]; void manacher() { int id=0,mx=0,ans=0; for(int i=2;i<=2*n;i++) { if(mx>i)p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(s2[i+p[i]]==s2[i-p[i]])++p[i]; if(i+p[i]>mx) { id=i; mx=i+p[i]; } ans=max(ans,p[i]-1); } printf("%d\n",ans); } void init() { n=strlen(s1); s2[0]='$'; for(int i=0;i<=n;i++) s2[2*i+1]='#',s2[2*i+2]=s1[i]; manacher(); } int main() { while(scanf("%s",s1)!=EOF) { memset(p,0,sizeof(p)); memset(s2,0,sizeof(s2)); init(); } return 0; }