板子-马拉车算法
好久没写博客了==
#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;
}