【最长回文子串】HDU3068最长回文【Manacher算法】
2016-05-08 21:27
495 查看
一张图领悟Manacher算法,计算字符串最长回文子串
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
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
aaaa
abab
Sample Output
4
3
代码:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
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
aaaa
abab
Sample Output
4
3
代码:
#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; }
相关文章推荐
- 71.JAVA编程思想——JAVA与CGI
- C#流程控制2
- linux日期命令date/cal
- Java实验五
- 一些令你瞠目结舌的爬虫技巧[转]
- 20150323--memcache-02
- 动态规划求最长公共子序列问题
- ipython
- fedora23 安装vsftpd
- 使用jsoup的爬虫例子
- TCP数据传输(七):多线程改进多个客户端上传文件案例
- hadoop Apache版本的启动命令
- Android蓝牙开发简介
- 20150323--memcache-01
- 小eval解决大问题---python
- stringWithFormat和stringWithString有什么区别
- 蓝牙技术简介
- CTSC && APIO
- fiddler显示请求的ip地址
- APIO滚粗记