Manacher 算法 1
当然不排除
压倒式的简单&
这玩意是求出以一个点为中心的最长回文串
拿一个已经知道的点去扩展右边界
记当前更新的点为
对于
这个时候由于
但是我们知道
别的部分暴力
这一部分结束以后,当前答案由于中间插空答案会大
然后再去一直更新就好了
由于回文串的性质,实际上求出了最长回文串就相当于求出了所有回文串,只不过是次级信息
对于奇偶回文串的处理就是中间插空直接搞
最后就是答案减1;
Code:
点击查看代码
void Manacher(){
int m=2,len=strlen(ch+1);
a[1]='$',a[2]='&';
for(int i=1;i<+n;i++){
m++;
a[m]=ch[i];
m++;
a[m]='&';
}
for(int i=3,now=0,r=0;i<m;i++){
if(i<r){
q[i]=min(q[mid*2-i],r-i);
}
else{
q[i]=1;
}
while(a[i-q[i]]==a[i+q[i]]){
q[i]++;
}
if(i+q[i]>r){
r=q[i]+i;
mid=i;
}
}
}
两个校测的例题不方便放就扔文章题解区了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具