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等
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
两组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
- Hdu 3068 最长回文 (manacher算法)
- hdu 3068 最长回文 (manacher算法)
- HDU 3068 最长回文(Manacher 算法)
- HDU-3068-最长回文 (Manacher算法)
- hdu 3068 最长回文(manacher算法)
- HDU 3068 最长回文 Manacher算法
- hdu 3068 最长回文 manacher算法
- hdu 3068 最长回文(manacher算法)
- Hdu 3068 最长回文 Manacher 算法
- hdu 3068 最长回文 (Manacher算法)
- HDU 3068 最长回文 (Manacher算法)
- hdu-3068 最长回文 【Manacher算法】
- Hdu 3068 最长回文(manacher算法)
- HDU 3068 最长回文(manacher算法)
- HDU 3068 最长回文 (manacher算法)
- HDU 3068 最长回文(manacher算法模板)
- hdu 3068 最长回文 manacher算法
- [hdu 3068] 最长回文 manacher算法
- centos 安装php
- SAM数据格式学习3之官方文档
- 排序算法总结
- 面向对象的设计原则(一)
- POJ 1206 置换群
- Hdu 3068 最长回文【manacher算法】
- 关联容器Map c++ stl
- svn commit
- edittext获取焦点并弹出软键盘
- CodeForces - 582B Once Again... (LIS变型)好题
- 【bzoj2145】悄悄话 乱搞
- Codeforces Round #347 (Div. 2)-Complicated GCD(字符串判等)
- 滑动窗口的最大值
- 阮一峰 KMP BM算法