马拉车算法——求回文串起点hdu3294

#include<bits/stdc++.h>
using namespace std;
#define maxn 500005
int p[maxn];
char s[maxn],s_new[maxn],ch[2];
int start;
int init(){
    int len=strlen(s);
    int j=2;
    s_new[0]='$',s_new[1]='#';
    for(int i=0;i<len;i++){
        s_new[j++]=s[i];
        s_new[j++]='#';
    }
    s_new[j]=0;
    return j;
}
int manacher(){
    int len=init();
    int mx=0,id,res=0;
    start=0;
    for(int i=0;i<len;i++){
        if(mx>i)p[i]=min(p[id*2-i],mx-i);
        else p[i]=1;
        while(s_new[i-p[i]]==s_new[i+p[i]])p[i]++;
        if(mx<i+p[i])
            mx=i+p[i],id=i;
        if(res<p[i]-1)
            res=p[i]-1,start=(i-p[i]+2)/2-1;
    }
    return res;
}
int main(){
    while(scanf("%s%s",ch,s)!=EOF){
        memset(p,0,sizeof p);
        int res=manacher();
        if(res<=1){
            puts("No solution!");
            continue;
        }
        cout<<start<<" "<<start+res-1<<'
';
        for(int i=start;i<start+res;i++){
            if(s[i]-ch[0]>=0)cout<<(char)(s[i]-ch[0]+'a');
            else cout<<(char)(s[i]-ch[0]+26+'a');
        }
        puts("");
    }
}
原文地址:https://www.cnblogs.com/zsben991126/p/10784774.html