模板
计算出字符串中以每个字符为对称中心的最长回文串的长度加\(1\)的值。
时间复杂度为\(O(n)\)。
#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define PLI pair<LL,int>
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define lowbit(x) (x&(-x))
using namespace std;
const int maxn=1e7+2e6;
int p[3*maxn],len1,len2;
char s[maxn],str[3*maxn];
void init(){
len1=strlen(s);
len2=2*len1+2;
str[0]='$';
str[1]='#';
for(int i=0;i<len1;i++){
str[i*2+2]=s[i];
str[i*2+3]='#';
}
}
void manacher(){
int id,mx=0;
for(int i=1;i<len2;i++){
if(mx>i) p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
for(;str[i-p[i]]==str[i+p[i]];p[i]++);
if(i+p[i]>mx){
mx=i+p[i];
id=i;
}
}
}
int main(){
scanf("%s",s);
init();
manacher();
int ans=0;
for(int i=1;i<len2;i++){
ans=max(ans,p[i]);
}
printf("%d\n",ans-1);
}
模板题:hdu3068 最长回文