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;
}
posted @ 2016-12-02 19:06  Krew  阅读(110)  评论(0)    收藏  举报