1. 程式人生 > 其它 >manacher(馬拉車演算法)

manacher(馬拉車演算法)

manacher演算法

這個演算法我相信絕對是比kmp好理解多了

含義

首先看manacher演算法的含義:
洛谷P3805 模板manacher演算法

給出一個只由小寫英文字元 a,b,c,d,e……z 組成的字串 S ,求 S 中最長迴文串的長度 。
字串長度為 n。

初步構想

暴力匹配,每一個位置向左右拓展

優化

我們發現,我們可以定義一個數組p[i]表示以i為中點的最大回文子串半徑
那麼我們每次都向外拓展即可

程式碼實現

然後再搞一個兩個字元之間插入#的騷操作,就結束了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=11000002;
char data[maxn<<1];
int p[maxn<<1],cnt,ans;

inline void init(){
    char c=getchar();
    data[0]='~',data[cnt=1]='|';
    while(c>='a'&&c<='z') data[++cnt]=c,data[++cnt]='|',c=getchar();
}

int main(){
    init();

    for(int l=1,r=0,mid=0;l<=cnt;l++){
        if(l<=r) p[l]=min(p[(mid<<1)-l],r-l+1);
        while(data[l-p[l]]==data[l+p[l]]) p[l]++;
        if(l+p[l]>r) r=p[l]+l-1,mid=l;
        ans=max(ans,p[l]);
    }

    printf("%d\n",ans-1);
    return 0;
}