您的位置:首页 > 其它

hdu 3068

2017-11-30 09:51 134 查看
点击打开链接
//manacher算法求最长回文子串,时间复杂度为O(n)
//关键是构造P数组
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=(110000+5)*2;
int P[maxn];
char T1[maxn];
char T2[maxn];
//P[i]-1恰好是位置i处的最长回文子串长度
//求解P数组
void Manacher(char T[])
{
int pos=0,mx=0;
P[0]=0;                 //0位置不考虑,为$标志
for(int i=1;T[i];i++)
{
if(mx>i) P[i]=min(P[2*pos-i],mx-i);
else P[i]=1;
while(T[i+P[i]]==T[i-P[i]]) P[i]++;                 //进行匹配
if(mx<P[i]+i)
{
mx=P[i]+i;
pos=i;
}
}
}
// 构造T2串
void init()
{
int i,j=2;
T2[0]='$',T2[1]='#';                //$符号是为了防止数组下标越界
for(i=0;T1[i];i++)
{
T2[j++]=T1[i];
T2[j++]='#';
}
T2[j]='\0';
}
int main()
{
while(scanf("%s",T1)!=EOF)
{
init();
Manacher(T2);
int ans=0;
for(int i=1;T2[i];i++)
ans=max(ans,P[i]);
printf("%d\n",ans-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 hdu manacher