板子-马拉车算法

好久没写博客了==

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
typedef long long ll;
typedef unsigned long long ull;
const int maxn=11000500;
const int MOD=1e6;

char str[maxn<<1];
int num[maxn<<1];
int len=0,ans=0;

inline void deal(){
    char c=getchar();
    str[0]='@';
    str[++len]='#';
    while(c<'a'||c>'z') c=getchar();
    while(c>='a'&&c<='z'){
        str[++len]=c;
        str[++len]='#';
        c=getchar();
    }
}

void manacher(){
    for(int i=1,id=0,mid=0;i<=len;++i){
        if(i<=id) num[i]=min(num[(mid<<1)-i],id-i);
        while(str[i+num[i]+1]==str[i-num[i]-1]) ++num[i];
        if(num[i]+i>id) {
            id=num[i]+i;
            mid=i;
        }
        ans=max(num[i],ans);
    }
    return;
}

int main(){
    deal();
    manacher();
    cout<<ans;
    return 0;
}
posted @ 2021-03-29 22:12  七铭的魔法师  阅读(69)  评论(0编辑  收藏  举报