学习一下 manacher 算法,这是 manacher 算法的模板题
下面是模板代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=30000000;
char ch[maxn],str[maxn];
int len[maxn];
int n;
void kaven(){
str[0]='$';str[1]='#';
int j=1;
for(int i=0;i<n;i++) str[++j]=ch[i],str[++j]='#';
str[++j]='^';
n=j;
}
int manacher(){
int Max=1;
int Maxr=0,mid;
for(int i=1;i<n;i++){
if(i<Maxr) len[i]=min(len[mid*2-i],Maxr-i);
else len[i]=1;
while(str[i-len[i]]==str[i+len[i]]) len[i]++;
if(len[i]+i>Maxr){
Maxr=len[i]+i;
mid=i;
}
Max=max(Max,len[i]-1);
}
return Max;
}
int main(){
scanf("%s",ch);
n=strlen(ch);
kaven();
printf("%d\n",manacher());
}