最长回文串 Manacher
2017-07-10 16:00
155 查看
复杂度O(n)
Manacher’s ALGORITHM: O(n)时间求字符串的最长回文子串
Manacher’s ALGORITHM: O(n)时间求字符串的最长回文子串
#include <bits/stdc++.h> using namespace std; const int MAXN = 1E6; int p[MAXN*2];//p[i]:=转换后的字符串以t[i]为中心的回文串一侧长度+1(中心) char s[MAXN]; char t[MAXN*2];//装换后的字符 //abac转换后 //$#a#b#c#\0 //以原字符串第i个字符为中心的最长回文串总长度 = p[i*2+2] - 1; //以s[i]和s[i+1]中间为中心的最长回文串总长度 = p[i*2+3] void manacher() { int len = strlen(s); t[0] = '$'; t[1] = '#'; for(int i=0; i<len; ++i) t[i*2+2] = s[i], t[2*i+3] = '#'; t[len*2+2] = '\0'; int id = 0, mx = 0; //id为一直右边界最大的回文串的中心, mx=id+p[id] memset(p, 0, sizeof(int)*len*2+3); for(int i=1; i<len*2+2; ++i) { //mx<=i则要从一个字符开始向两边匹配 //否则取p[id*2-i](i关于id的对称点), mx-i(i与id为中心的回文串最右边的距离)的最小值 p[i] = mx > i ? min(p[id*2-i], mx-i) : 1; while(t[i+p[i]] == t[i-p[i]]) ++p[i];//继续匹配 if(i+p[i] > mx) mx = i+p[i], id = i;//更新mx和id } } int main() { while(cin >> s) { manacher(); cout << t << endl; for(int i=0; i<(int)strlen(t); ++i) cout << p[i]; cout << endl; } return 0; }
相关文章推荐
- 【bzoj 2565】最长双回文串(manacher)
- 最长回文串O(N)算法 manacher
- [bzoj2565]最长双回文串 manacher
- Ural1297Palindrome最长回文串.manacher解法
- BZOJ 2565: 最长双回文串 [Manacher]
- bzoj 2565 最长双回文串 - Manacher
- hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))
- hdu 3068 最长回文 (Manacher算法求最长回文串)
- hdu3068_最长回文串_Manacher(马拉车模板)
- hdu3068 最长回文串 (manacher)
- BZOJ_2565_最长双回文串_manacher
- BZOJ 2565 最长双回文串 Manacher
- manacher算法求最长回文串长度
- 【manacher变形】Timus OJ 1354. Palindrome. Again Palindrome 包尾部最长回文串
- bzoj 2565: 最长双回文串(manacher)
- hdu 3068 && pku 3974 (最长回文串)(Manacher 算法)
- HYSBZ - 2565 最长双回文串 Manacher
- 【单调队列DP+manacher】BZOJ2565-最长双回文串
- Manacher算法求最长回文串
- 【BZOJ2565】最长双回文串 Manacher