HDU3068(最长回文子串 马拉车板子)

题目
HDU3068(最长回文子串 马拉车板子)_第1张图片
Manacher

//manacher板子
#include
using namespace std;
const int N=110000+5;
char str[N],s[N<<1];int len[N<<1];
int main(){
    while(~scanf("%s",str+1)){
        int n=strlen(str+1);s[0]='@';
        for(int i=1;i<=2*n;i+=2) s[i]='#',s[i+1]=str[(i+1)>>1];
        s[2*n+1]='#',s[2*n+2]='$',s[2*n+3]='\0';
        int mx=0,po=0,ans=0;
        for(int i=1;i<=2*n;++i){
            (mx>i)?(len[i]=min(mx-i,len[2*po-i])):(len[i]=1);
            while(s[i-len[i]]==s[i+len[i]]) ++len[i];
            if(i+len[i]-1>mx) mx=i+len[i]-1,po=i;
            ans=max(ans,len[i]-1);
        }
        printf("%d\n",ans);
    }
}

你可能感兴趣的:(字符串==manacher)