您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: