您的位置:首页 > 其它

Manacher——最大回文子串的线性算法

2016-03-18 16:44 302 查看

问题描述

回文串:正读和反读都一样的字符串

输入一个字符串,求出其中最大的回文子串。

Manacher——最大回文子串的线性算法

点击详细了解算法

模板

随便写的,应该有bug= =

#include<iostream>
#include<cstring>
#include<string>
#define maxn 60100
using namespace std;
int n;
char s[maxn];
int p[maxn];
void init(){
cin >> n;
n=n*2+1;
getchar();
s[0]='$';
for (int i=2;i<=n;i+=2){
s[i-1]='#';
s[i]=getchar();
}
s
='#';
s[n+1]='@';
}
int manacher(){
memset(p,0,sizeof(p));
int maxr=0,maxid=0,ans=0;
for (int i=1;i<=n;i++){
p[i]=(i<maxr)?min(p[maxid*2-i],maxr-i):1;
while (s[i+p[i]]==s[i-p[i]]) p[i]++;
if (i+p[i]>maxr) maxr=i+p[i],maxid=i;
ans=max(ans,p[i]-1);
}
return ans;
}
int main(){
init();
cout << manacher() << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息