manacher

2024.1.29 寒假集训$\ $模板

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
string s,t="@#";
int n,d[N];
void baoli()
{
    for(int i=0;i<n;i++){
        d[i]=1;
        while(i-d[i]>=0&&i+d[i]<n&&s[i-d[i]]==s[i+d[i]])d[i]++;
        cout<<d[i]<<' ';
    }
    return ;
}
void manacher()
{
    for(int i=0;i<n;i++){
        t+=s[i];
        t+='#';
    }
    n=2*n+1;
    for(int i=0,l=0,r=-1;i<n;i++){
        if(i>r){
            d[i]=1;
            while(i-d[i]>=0&&i+d[i]<n&&t[i-d[i]]==t[i+d[i]])d[i]++;
        }
        else{
            int j=l+r-i;
            d[i]=min(d[j],j-l+1);
            while(i-d[i]>=0&&i+d[i]<n&&t[i-d[i]]==t[i+d[i]])d[i]++;
        }
        l=i-d[i]+1;
        r=i+d[i]-1;
        d[i]=(d[i]+1)/2;
        if(i%2==0&&i!=0)cout<<d[i]<<' ';
    }
    return ;
}
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    cin>>n;
    cin>>s;
    baoli();
    cout<<endl;
    manacher();
    cout<<endl;
}
posted @ 2024-01-29 21:20  Abnormal123  阅读(13)  评论(1)    收藏  举报