您的位置:首页 > 其它

最长回文字符串模板(manacher算法 时间复杂度O(n))

2017-05-08 15:21 375 查看
manacher算法详解:点击打开链接

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 220005;
char str
;
int p
;
void manacher(char *s, int len)
{
p[0] = 1;
int mmax = 0, id = 0;
for(int i = 1; i< len; i++)
{
p[i] = mmax > i? min(p[id*2-i], mmax-i):1;
while(s[i+p[i]] == s[i-p[i]]) p[i]++;
if(i + p[i]> id + p[id])
{
id = i;
mmax = i+p[i];
}
}
}
int main()
{
while(~scanf("%s", str))
{
int len = strlen(str);
for(int i = len; i >= 0; i--)
{
str[(i<<1)+1] = '#';
printf("BUG1 %d\n", (i<<1)+1);
str[(i<<1)+2] = str[i];
printf("BUG2 %d\n", (i<<1)+2);
}
str[0] = '*';//防止数组越界
len = len*2+2;
printf("%s\n", str);
manacher(str, len);
int ans = 0;
for(int i = 0; i < len; i++)
ans = max(ans, p[i]-1);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息