Manacher算法求最长回文子串的长度
2012-11-21 15:23
127 查看
const int N = 100005; char str ; //原字符串 char s[N << 1]; //用'#'作为间隔填充之后的字符串 int p[N << 1]; //p[i]表示以第i个字符为中心的回文子串的长度加1 int len; int ans; //最长回文子串的长度 void Manacher() { int i; int mx; //mx表示当前回文子串扩展的最右端 int id; //id表示mx是由哪个回文子串扩展出来的 len = (strlen(str) + 1) << 1; for (i = 0; i < len; ++i) //构造填充字符串 { s[i] = '#'; p[i] = 0; } for (i = 0; str[i] != 0; ++i) s[(i + 1) << 1] = str[i]; s[(i + 1) << 1] = 0; mx = 0; ans = 0; for (i = 1; s[i] != 0; ++i) //求解p数组 { if (mx > i) p[i] = min(mx - i, p[(id << 1) - i]); else p[i] = 1; while (s[i - p[i]] == s[i + p[i]]) ++p[i]; if (i + p[i] > mx) { mx = i + p[i]; id = i; } if (p[i] - 1 > ans) ans = p[i] - 1; //更新最长回文子串的长度 } }
上述代码中p数组保存的是在扩展字符串中,以当前位置的字符为中心的最长回文子串的长度加1。
相关文章推荐
- manacher算法_求最长回文子串长度
- Manacher算法实现求最长回文子串的长度
- O(n)的方法求最长回文子串长度(Manacher算法)
- hihoCoder 1032 最长回文子串(Manacher算法)
- 求最长回文子串的Manacher算法
- O(N)最长回文子串算法——Manacher算法
- 九度笔记之 1528:最长回文子串 用manacher算法
- poj 3974 Palindrome 【最长连续回文子串,Manacher算法】
- 最长回文子串——Manacher算法
- 最长回文(manacher算法,最大回文子串)
- 九度OJ 1528 最长回文子串 -- Manacher算法
- Manacher算法——找字符串最长的回文子串
- poj 3974 Palindrome(最长回文子串,处理大数,Manacher算法)
- 最长回文子串 ( manacher算法 ) HDU3068
- hihoCoder#1032 : 最长回文子串(manacher算法)
- 给定一个字符串s,找出s中最长的回文子串,你可以假设s的最大长度是1000。
- Poj3974 最长回文子串 Manacher算法
- Manacher算法: O(n)时间求字符串的最长回文子串
- 求最长回文子串_Manacher算法_Java实现
- 给定一个字符串,求它的最长回文子串的长度,并打印出最长回文子串