【最长回文子串】HDU3068最长回文【Manacher算法】
来源:互联网 发布:彩虹岛 知乎 编辑:程序博客网 时间:2024/04/30 16:03
一张图领悟Manacher算法,计算字符串最长回文子串
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
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
代码:
#include<iostream>#include<cstring>using namespace std;string s;int p[110050*2]; // 这里需要注意,数组的长度大于字符串的长度的两倍;// 将字符串转换成奇字符串void init(){ memset(p,0,sizeof(p)); string s1="$"; for(int i=0;i<s.size();i++){ s1+='#'; s1+=s[i]; } s1+='#'; s=s1;}// 计算p[id]表示id位置的回文半径void Manacher(){ int id=0; // id位置的右边界最靠右(在已知范围内); int mx=0; // id的右边界位置; for(int i=1;i<s.size();i++){ if(mx>i) p[i]=min(p[2*id-i],mx-i); else p[i]=1; for(;s[i-p[i]]==s[i+p[i]];p[i]++); if(i+p[i]>mx){ mx=i+p[i]; id=i; } }}int main(){ cin.sync_with_stdio(false); while(cin>>s){ init(); Manacher(); int ans=0; for(int i=1;i<s.size();i++){ if(ans<p[i]) ans=p[i]; } cout<<ans-1<<endl; } return 0;}
0 0
- HDU3068(最长回文子串manacher算法)
- 【最长回文子串】HDU3068最长回文【Manacher算法】
- 【Manacher算法】hdu3068 最长回文
- HDU3068最长回文 Manacher算法
- hdu3068 最长回文--Manacher算法
- manacher算法求最长回文子串(hdu3068)
- HDU3068-manacher算法-最长回文串
- 【HDU3068】最长回文【manacher】
- HDU3068 最长回文 manacher
- 【HDU3068】最长回文【Manacher】
- 最长回文 hdu3068 manacher
- Manacher HDU3068 最长回文
- HDU3068[最长回文]--Manacher
- Manacher算法,O(n)回文子串算法 以及模板题HDU3068最长回文串
- hdu3068 manacher算法 最长回文子…
- hdu3068 最长回文(manacher 算法)
- hdu3068最长回文(manacher算法)
- HDU3068 最长回文(Manacher算法)
- (有码)OC单例
- 小eval解决大问题---python
- swap:临时变量vs和交换vs位运算 时间对比
- fiddler显示请求的ip地址
- 自定义View系列教程02--onMeasure源码详尽分析
- 【最长回文子串】HDU3068最长回文【Manacher算法】
- NSString
- 利用curl进行逆地理编码_c语言编写动态链接库对PostgreSQL进行扩展
- APIO滚粗记
- 内聚 耦合
- HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博奕)
- stringWithFormat和stringWithString有什么区别
- 蓝牙技术简介
- mysql数据库表清空后id如何从1开始自增