manacher求最长回文子串算法模板

 

 

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define maxn 110100
int p[2*maxn];
char s[2*maxn];

void manacher(char *s){
    int n=strlen(s);
    for(int i=n;i>=0;i--){
        s[2*i+2]=s[i];
        s[2*i+1]='#';
    }
    s[0]='*';
    int mx=0;
    int id;
    int ans=0;
    for(int i=1;i<2*n+2;i++){
        if(mx>i)
            p[i]=min(p[2*id-i],mx-i);
        else
            p[i] = 1;
        for(;s[i+p[i]]==s[i-p[i]];p[i]++) ;
        if(p[i]+i>mx){
            mx=p[i]+i;
            id=i;
        }
        ans=max(p[i],ans);
    }
    printf("%d\n",ans-1);
}
int main()
{
    while(scanf("%s",s)!=EOF){
        manacher(s);
    }
    return 0;
}

 

posted on 2015-10-13 09:29  Beserious  阅读(141)  评论(0编辑  收藏  举报