manacher
manacher(马拉车)算法是用于解决O(n)复杂度的情况下求字符串中最长回文串的长度。
首先,统一奇长度回文串和偶长度回文串的处理方式,可以在每两个字符中间插入"#",例如: # # # #。这样就可以把所有的回文串转化为奇长度回文串。设为回文串半径,对于奇长度回文串和偶长度回文串,设原长为,转换后的回文串长度为,,所以。
然后假设已知,求,当时,即
否则
再看以i为中心的回文串是否能继续扩大。
最后找出最大值就可以了。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int n;
char a[50000010];
int ans=1;
int f[50000010];
int main(){
scanf("%s",a+1);
n=strlen(a+1);
for(int i=2*n;i>=1;i-=2){
a[i]=a[i/2];
}
for(int i=1;i<=2*n+1;i+=2){
a[i]='#';
}
int mx=0;
int id=0;
for(int i=1;i<=2*n+1;i++){
if(mx>i){
f[i]=min(f[id*2-i],mx-i);
}
else{
f[i]=1;
}
while(a[i+f[i]]==a[i-f[i]]&&i+f[i]<2*n+2&&i-f[i]>0){
f[i]++;
}
ans=max(ans,f[i]-1);
if(i+f[i]>mx){
mx=i+f[i];
id=i;
}
}
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】