最长回文
#include <iostream> using namespace std; #include <string> int Min(int a,int b) { int c=a<b?a:b; return c; } int p[220020]; int main() { char str[220020],str1[110010]; while (cin>>str1) { int len=strlen(str1); if (len==0) continue; str[0]='$'; str[1] = '#'; int i , j = 2; for (i=0;i<len;i++) { str[j++] = str1[i]; str[j++] = '#'; } str[j]='\0'; int id; int mx=0; int n = j ; memset(p,0,sizeof(p)); for (i=1;i<n;i++) { if (mx>i) { p[i]=Min(p[2*id-i],mx-i); //优化的关键 } else { p[i]=1; } while (str[i+p[i]]==str[i-p[i]]) p[i]++; if (mx<p[i]+i) { mx=p[i]+i; id=i; } } int max=p[1]; for (i=1;i<n;i++) { if (max<p[i]) max=p[i]; } cout<<max-1<<endl; } return 0; }
最长回文
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 40 Accepted Submission(s) : 13
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
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 3