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
字符串求最长回文串的模板题:
代码如下:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int N=120005; int p[2*N]; char s[2*N],str[2*N]; int n; void kp() { int mx=0; int id; ///for(i=n;str[i]!=0;i++) ///str[i]=0; ///没有这一句有问题,就过不了ural1297,比如数据:ababa aba; for(int i=1;i<n;i++) { if(mx>i) p[i]=min(p[2*id-i],p[id]+id-i); else p[i]=1; for( ;str[i+p[i]]==str[i-p[i]];p[i]++); if(p[i]+i>mx) { mx=p[i]+i; id=i; } } } void init() { str[0]='$'; str[1]='#'; for(int i=0;i<n;i++) { str[i*2+2]=s[i]; str[i*2+3]='#'; } n=n*2+2; s[n]=0; } int main() { while(scanf("%s",&s)!=EOF) { n=strlen(s); init(); kp(); int tmp=0; for(int i=1;i<n;i++) if(p[i]>tmp) tmp=p[i]; printf("%d ",tmp-1); } return 0; }