manacher算法之最大回文子串
2018-02-18 12:42
393 查看
#include<iostream> #include<string> #include<algorithm> using namespace std; string Manacher(string &s)//预处理偶数回文。比如讲abba处理成#a#b#b#a#,这样就形成以#为对称轴的回文串 { string manachers("#"); for (int i = 0; i < s.length();i++) { manachers.push_back(s[i]); manachers.push_back('#'); } cout << manachers << endl; return manachers; } int MaxLcpLen(string str) { string s = str; if (str.length() == 0)return 0; if (str.length() % 2 == 0) s = Manacher(str);//偶数回文转换成奇数回文,不影响结果 int *pArr = new int[s.length()];//保存每个字符的回文半径 int pR = -1;//之前遍历的字符的最大回文半径最右端的下一个字符 int index = -1; for (int i = 0; i < s.length();++i) { pArr[i] = pR > i ? min(pArr[2*index - i], pR - i) :1; while (i + pArr[i] < s.length() && i - pArr[i] > -1){ if (s[i + pArr[i]] == s[i - pArr[i]]) pArr[i]++; else break; } if (i + pArr[i] > pR){ index = i; pR = i + pArr[i]; } } return *max_element(pArr, pArr + s.length()); } void main() { string s = "abc1234321ab"; cout << MaxLcpLen(s)- 1 << endl; cin.get(); }
相关文章推荐
- 求最大回文子串(Manacher算法)
- 线性时间求最大回文子串的Manacher算法
- poj3974 manacher算法,最大回文子串
- hdu 4513 吉哥系列故事——完美队形II(最大回文子串-manacher算法)
- 最长回文(manacher算法,最大回文子串)
- hdu3294 Girls' research (manacher算法,最大回文子串)
- Manacher算法(最大回文子串),JAVA实现
- Manacher算法。最大回文子串。
- JAV打印字符串中最大的回文子串
- 算法——Manacher算法(求最长回文子串)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- Manacher算法--O(n)回文子串算法
- 数据结构学习笔记4-最长回文子串(Manacher算法)
- Manacher算法--O(n)回文子串算法
- 字符串 专题训练 · 最长回文子串之Manacher算法
- Manacher 算法(求字符串的回文子串的最大长度)
- 【回文字符串】 最长回文子串O(N) Manacher算法
- c++之求一个字符串中的最大回文子串
- 最长回文子串:Manacher算法[转]
- hihoCoder#1032 : 最长回文子串(manacher算法)