最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14205 Accepted Submission(s): 5168
Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa abab
Sample Output
4 3AC-code:#include<cstdio> #include<cstring> char str[110005],s[220010]; int main() { int len,i,j,sum,mx,id,p[220010]; while(~scanf("%s",str)) { getchar(); len=strlen(str); s[0]='?',s[1]='#'; for(i=0;i<len;i++) { s[2*i+2]=str[i]; s[2*i+3]='#'; } s[2*i+2]='\0'; mx=id=0; for(j=1;j<2*i+2;j++) { if(mx>j) p[j]=p[2*id-j]>mx-j?mx-j:p[2*id-j]; else p[j]=1; while(s[j-p[j]]==s[j+p[j]]) p[j]++; if(p[j]+j>mx) { mx=p[j]+j; id=j; } } sum=0; for(i=1;i<j;i++) sum=sum>p[i]?sum:p[i]; printf("%d\n",sum-1); } }