Hdu 3068 最长回文【manacher算法】

来源:互联网 发布:大连理工软件学院几本 编辑:程序博客网 时间:2024/06/05 07:40

最长回文

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14478 Accepted Submission(s): 5281


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
aaaaabab

Sample Output
43

题解:

manacher 算法,不太懂,就大约敲敲模板吧...

/*http://blog.csdn.net/liuke19950717*/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=110005;char s[maxn],str[maxn*2];int p[maxn*2];int manacher(char T[]){int len=strlen(s);int l=0;str[l++]=-1;str[l++]=-2;//这里选负值是避免文本中出现自己设置的标志,一般没负值for(int i=0;i<len;++i){str[l++]=T[i];str[l++]=-2;}str[l]=0;int mx=0,id=0,ans=0;for(int i=0;i<l;++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(i+p[i]>mx){mx=i+p[i];id=i;}ans=max(p[i]-1,ans);}return ans;}int main(){while(~scanf("%s",s)){printf("%d\n",manacher(s));}return 0;}


0 0
原创粉丝点击