字符串之最长回文子串 manacher算法
来源:互联网 发布:mac下的数据库软件 编辑:程序博客网 时间:2024/05/01 07:47
manacher算法
来源:http://blog.csdn.net/xingyeyongheng/article/details/9310555
回文就是正反读都是一样的字符串,如aba, abba等
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
aaaaabab
43
注:此篇文章大体思路讲的清晰,但是具体细节有错误,阅读时请注意,建议参考另一篇:
https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.05.md
manacher算法:
定义数组p[i]表示以i为中心的(包含i这个字符)回文串半径长
将字符串s从前扫到后for(int i=0;i<strlen(s);++i)来计算p[i],则最大的p[i]就是最长回文串长度,则问题是如何去求p[i]?
由于s是从前扫到后的,所以需要计算p[i]时一定已经计算好了p[1]....p[i-1]
假设现在扫描到了i+k这个位置,现在需要计算p[i+k]
定义maxlen是i+k位置前所有回文串中能延伸到的最右端的位置,即maxlen=p[i]+i;//p[i]+i表示最大的
注意:这里有点小错,上式maxlen=p[i]+i不一定成立,即当前延伸到最右端的回文子串不一定以i为中心,所以,下面都要进行相应修改
分两种情况:
1.i+k这个位置不在前面的任何回文串中,即i+k>maxlen,则初始化p[i+k]=1;//本身是回文串
然后p[i+k]左右延伸,即while(s[i+k+p[i+k]] == s[i+k-p[i+k]])++p[i+k]
2.i+k这个位置被前面以位置i为中心的回文串包含,即maxlen>i+k
这样的话p[i+k]就不是从1开始
由于回文串的性质,可知i+k这个位置关于i与i-k对称,
所以p[i+k]分为以下3种情况得出
//黑色是i的回文串范围,蓝色是i-k的回文串范围,
hdu3068代码:
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<string>
- #include<queue>
- #include<algorithm>
- #include<map>
- #include<iomanip>
- #define INF 99999999
- using namespace std;
- const int MAX=110000+10;
- char s[MAX*2];
- int p[MAX*2];
- int main(){
- while(scanf("%s",s)!=EOF){
- int len=strlen(s),id=0,maxlen=0;
- for(int i=len;i>=0;--i){//插入'#'
- s[i+i+2]=s[i];
- s[i+i+1]='#';
- }//插入了len+1个'#',最终的s长度是1~len+len+1即2*len+1,首尾s[0]和s[2*len+2]要插入不同的字符
- s[0]='*';//s[0]='*',s[len+len+2]='\0',防止在while时p[i]越界
- for(int i=2;i<2*len+1;++i){
- if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i);
- else p[i]=1;
- while(s[i-p[i]] == s[i+p[i]])++p[i];
- if(id+p[id]<i+p[i])id=i;
- if(maxlen<p[i])maxlen=p[i];
- }
- cout<<maxlen-1<<endl;
- }
- return 0;
- }
- 字符串之最长回文子串 manacher算法
- Manacher算法求字符串的最长回文子串
- 【字符串处理】最长回文子串笔记(Manacher算法)
- 字符串 专题训练 · 最长回文子串之Manacher算法
- 求解最长回文子串 Manacher算法 之 POJ 3974
- 求解最长回文子串 之Manacher算法
- 字符串 manacher 最长回文子串
- Manacher算法求最长回文子串
- Manacher算法求最长回文子串
- 最长回文子串(Manacher算法)
- Manacher算法 最长回文子串
- 最长回文子串的manacher算法
- 最长回文子串,Manacher算法
- Poj3974 最长回文子串 Manacher算法
- 最长回文子串 manacher算法
- Manacher算法(最长子回文串)
- hihocoder1032(最长回文子串manacher算法)
- HDU3068(最长回文子串manacher算法)
- Python使用DB封装
- spring 邮件发送
- hdu 2993
- js学习笔记
- java实现将多个文件打包成zip压缩文件以及对压缩文件的加密
- 字符串之最长回文子串 manacher算法
- 突然的试验研究是什么
- Apache是怎样启动的
- LeetCode总结 -- 树的遍历篇
- javaScript操作table的整理
- POJ-3273-Monthly Expense
- 8.11-8.15知识点总结(待编辑)
- 字符过滤器
- Xrm.Utility.openEntityForm 时404.15 maxQueryString 错误 和 长度超过maxQueryStringLength值 错误