Manacher算法
Manacher算法
判断最长回文串是一个经典的问题,我们可以利用后缀数组在\(O(nlogn)\)时间内解决这个问题,但是Manacher算法却可以做到线性时间,而且易于编写的多。
详细说明:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824
代码:
int main()
{
while (scanf("%s",s+1)==1)
{
n=strlen(s+1),size=0;
rep(i,1,n) a[++size]=0,a[++size]=(int)(s[i]-'a'+1);
a[++size]=0;
a[0]=-1,a[size+1]=-2;
mx=0,ans=0;
rep(i,1,size)
{
if (i>mx) p[i]=0; else p[i]=min(p[(k<<1)-i],mx-i);
while (a[i+p[i]+1]==a[i-p[i]-1]) p[i]++;
if ((i+p[i])>mx) mx=i+p[i],k=i;
ans=max(ans,p[i]);
}
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号