最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8124 Accepted Submission(s): 2782
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 3manacher算法#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[220010]; int b[220010]; int main() { int i,k,n,maxln; while(scanf("%s",a)!=EOF) { k=maxln=0; n=strlen(a); for(i=n;i>=0;i--) { a[i+i+2]=a[i];//插入‘#’,将字符串长度变为奇数 a[i+i+1]='#'; } a[0]='@';//防止在执行while(a[i+k+b[i+k]]==a[i+k-b[i+k]])时,b[i]越界 for(i=2;i<2*n+1;i++)//manacher算法核心代码 { if(i<b[k]+k) b[i]=min(b[2*k-i],b[k]-i+k);//b[i]是以i为中心的回文串长度 else b[i]=1; while(a[i+b[i]]==a[i-b[i]]) b[i]++; if(b[i]+i>b[k]+k) k=i; if(maxln<b[i]) maxln=b[i]; } printf("%d\n",maxln-1); } return 0; }