luogu P1723 高手過愚人節

打算下週講課就講Manacher了

所以百度了一下相關題目,發現了一道千古好題

這道題沒想到是一道模板題,模板中的模板


 

簡要說一下思路,我們先複製一遍模板(甚至變量都不用改

然後唯一的區別就是要求的是最長連續迴文子串長度

那麼我們就在Manacher函數裏在最後統計一下最大值就行

優秀的代碼在這裏

#include<bits/stdc++.h>
using namespace std;
const int N = 21000000;
char s[N],str[N];
int p[N],n;
int init(){
    int len=strlen(s);
    str[0]='@',str[1]='#';
    int j=1;
    for(int i=0;i<len;++i){
        str[++j]=s[i];
        str[++j]='#';
    }
    str[++j]='\0';
    return j;
}
int Manacher(){
    int id=1,mx=1,maxn=0,len=init();
    for(int i=1;i<len;++i){
        if(i<mx) p[i]=min(p[id*2-i],mx-i);
        else p[i]=1;
        while(str[i-p[i]]==str[i+p[i]]) p[i]++;
        if(i+p[i]>mx){
            mx=i+p[i];
            id=i;
        }
        maxn=max(maxn,p[i]-1);//敲黑板,唯一的區別
    }
    return maxn;
}
int main(){
    cin>>n;
    while(n--){
        memset(p,0,sizeof(p));
        cin>>s;
        cout<<Manacher()<<endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章