HDU 3068 最长回文

http://acm.hdu.edu.cn/showproblem.php?pid=3068

新学的算法,求回文串用Manacher算法

讲解:http://acm.uestc.edu.cn/bbs/simple/?t3258.html

View Code
#include <iostream>
using namespace std ;
const int N=110001 ;
int len ;
int p[N<<1] ;
char s[N],str[N<<1] ;
void Manacher()
{
    int mx=0 ;
    int id ;
    for(int i=1;i<len;i++)
    {
        if(mx>i)
            p[i]=min(p[(id<<1)-i],mx-i) ;        
        else
            p[i]=1 ;
        for(;str[i+p[i]]==str[i-p[i]];p[i]++) ;
        if(p[i]+i>mx)
        {
            mx=p[i]+i ;
            id=i ;
        }
    }
}
int main()
{
    while(~scanf("%s",s))
    {
        len=strlen(s) ;
        str[0]='$' ;
        str[1]='#' ;
        for(int i=0;i<len;i++)
        {
            str[(i<<1)+2]=s[i] ;
            str[(i<<1)+3]='#' ;
        }
        len=(len<<1)+2 ;
        str[len]='\0' ;
        Manacher() ;
        int ans=-1 ;
        for(int i=0;i<len;i++)
            ans=max(ans,p[i]) ;
        printf("%d\n",ans-1) ;
    }
    return 0 ;
}
原文地址:https://www.cnblogs.com/xiaohongmao/p/2625445.html