洛谷 P3805 【模板】manacher算法

学习一下 manacher 算法,这是 manacher 算法的模板题
下面是模板代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn=30000000;

char ch[maxn],str[maxn];
int len[maxn];
int n;

void kaven(){

    str[0]='$';str[1]='#';
    int j=1;
    for(int i=0;i<n;i++) str[++j]=ch[i],str[++j]='#';
    str[++j]='^';
    n=j;
}

int manacher(){

    int Max=1;
    int Maxr=0,mid; 
    for(int i=1;i<n;i++){

        if(i<Maxr) len[i]=min(len[mid*2-i],Maxr-i);
        else len[i]=1;
        while(str[i-len[i]]==str[i+len[i]]) len[i]++;
        if(len[i]+i>Maxr){

            Maxr=len[i]+i;
            mid=i;
        }
        Max=max(Max,len[i]-1);
    }
    return Max;
}

int main(){

    scanf("%s",ch);
    n=strlen(ch);
    kaven();
    printf("%d\n",manacher());
} 

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/81516468