O(n)的回文子串Manacher算法
2016-04-10 14:21
351 查看
O(n)的回文子串Manacher算法
算法代码实现如下:
样例输入:
样例输出:
算法代码实现如下:
样例输入:
abab bbbb abba
样例输出:
3 4 4
#include <stdio.h> void Manacher (char str[], int len, int Radix[]){ int mx = 0; //记录被影响到的最远的位置 int id = 0; //最长影响串的位置 Radix[0] = 0; int i; for (i=1; i<len; ++i){ Radix[i] = 1; if (mx > i){ Radix[i] = Radix[2 * id - i]; if (mx - i < Radix[i]) Radix[i] = mx - i; } while (str[i - Radix[i]] == str[i + Radix[i]]) ++Radix[i]; if (i + Radix[i] > mx){ mx = i + Radix[i]; id = i; } } } int Preproccess (char str[], char old_str[]){ int index; int len; char middle = '#'; str[0] = '$'; str[1] = middle; index = 0; len = 2; while (old_str[index]){ str[len++] = old_str[index++]; str[len++] = middle; } str[len] = '?'; return len; } int main(void){ char old_str[200001]; char str[400004]; int Radix[400004]; int len; int i; int ans; while (scanf ("%s", old_str) != EOF){ len = Preproccess (str, old_str); Manacher (str, len, Radix); ans = 0; for (i=1; i<len; ++i){ if (ans < Radix[i]) ans = Radix[i]; } printf ("%d\n", ans - 1); } return 0; }
相关文章推荐
- Android Timer,TimerTask简单的使用
- 视频编码部分定义
- Dataset Database Connections/Connection to localhost.sde does not exist or is not supported
- LeetCode之14---Longest Common Prefix
- Base64加密解密实现
- CSS定位
- CANbus -----bit timing & synchronize mechanism
- Add Digits
- leetcode 202. Happy Number
- java中如何遍历实体类的属性和数据类型以及属性值
- Eclipse快捷键 10个最有用的快捷键
- Ajax 完整教程 (转)
- HDU-5661-Claris and XOR
- 求帧差程序
- iOS触摸事件
- 蚂蜂窝VS穷游最世界-自由行类App分析
- c/c++内存分配方式
- 邁向IT專家成功之路的三十則鐵律 鐵律十三:IT人理財之道-知足
- matlab实现分水岭算法处理图像分割
- 情商四大要素