计算出字符串中以每个字符为对称中心的最长回文串的长度加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 最长回文
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步