Manacher算法
来源:互联网 发布:apm地面站软件 安卓 编辑:程序博客网 时间:2024/06/06 02:49
这个算法在书上见的少,但在做题时处理字符串(尤其时回文串)时,还是一种十分优秀的算法。
Manacher算法可以在
定义:
p[i]:以s[i]为中心的最长回文子串,从s[i]向右延伸多长
我们先对每两个字符之间(包括开头和结尾)加入一个没出现过的字符(这里以%为例):
这样我们就巧妙地把奇数回文串与偶数回文串统一了。
可以发现
扫一遍就可以得到最长的回文字串。
现在关键问题就是求
显然
假设我们现在要求if(mx > i) p[i] = min(p[2*id-i], mx-i);
看一下这张图就很容易懂了。
然后我们就可以在
程序如下:
/*ID: Sunshine_cfbslLANG: C++*/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN = 100000010;char s[MAXN*2], t[MAXN];int n, p[MAXN*2], ans;void getp() { int i, mx = 0, id; for(i = 1; i < n; i++) { if(mx > i) p[i] = min(p[2*id-i], mx-i); else p[i] = 1; while(s[i+p[i]] == s[i-p[i]]) p[i]++; if(p[i] + i > mx) { mx = p[i] + i; id = i; } }}int main() { int i, l; scanf("%s", t); l = strlen(t); s[++n] = '%'; for(i = 0; i < l; i++) { s[++n] = t[i]; s[++n] = '%'; } n++; getp(); for(i = 1; i < n; i++) ans = max(ans, p[i]-1); printf("%d\n", ans); return 0;}
0 0
- Manacher算法
- Manacher算法
- Manacher算法
- Manacher算法
- Manacher 算法
- manacher算法
- manacher 算法
- Manacher算法
- manacher算法
- manacher算法
- manacher算法
- Manacher 算法
- Manacher算法
- manacher算法
- Manacher算法
- manacher算法
- Manacher算法
- Manacher算法:
- leetcode-171. Excel Sheet Column Number
- epoll 示例
- Boost智能指针——weak_ptr
- 学习笔记之部署流程
- Hdu-5821 Ball(贪心)
- Manacher算法
- linux的帮助系统之help
- 【NOIP2011模拟9.1】直角三角形 (Standard IO)
- 02. Yii 2.0 框架的目录结构
- linux文件时间戳
- iOS 64-bit architecture 使用objc_msgSend要小心
- Minimum Inversion Number(线段树&&逆序对)
- 服务器编程
- 8-11学习小结