manacher模板(manacher)

洛谷题目传送门
写完有一段时间了,发现板子忘记存在了这里。。。。。。

算法简述

一种字符串算法,O(n)高效求出以每个字符为对称中心的最长回文串长度。
然后,就可以进一步求出全串中最长回文串的长度,以及全串回文子串总数。
这篇博客已经讲的很清楚了。
有一个小细节还需要提一下。为了方便判断下标是否越界问题,我们可以这样做——将字符串从一号下标开始存储,然后在零号下标放一个与串中所有字符都不同的字符(包括中间插入的字符)。这样在扫到边界的时候,一定会匹配失败。这样少写了好几个if,非常方便。
其它就没什么问题了。模板如下:

#include<cstdio>
char s[23333333];
int f[23333333];
inline int min(register int x,register int y){return x<y?x:y;}
int main()
{
    register int len,i,l,r,mr=0,m=0,ans=0;
    s[0]='~';s[1]='%';//上面提到的小细节
    for(len=2;(s[len]=getchar())>='a';len+=2)
        s[len|1]='%';
    for(i=1;i<len;++i)
    {
        if(i<mr)f[i]=min(f[(m<<1)-i],mr-i);//最大化利用前面的信息
        for(l=i-f[i]-1,r=i+f[i]+1;s[l]==s[r];--l,++r,++f[i]);//继续向两侧匹配
        if(mr<r-1)mr=r-1,m=i;//更新最大可行右端点
        if(ans<f[i])ans=f[i];//更新最大长度
    }
    printf("%d\n",ans);
    return 0;
}

另外,向中间插入使得字符串长度增加了一倍。我在洛谷rank榜第一名的代码中看到,这位神犇居然没插字符!时间也基本比我少一半。
我还是懒得整理啦(其实是因为我太菜了)。可能会对奇数长度回文子串和偶数长度回文字串进行分别处理吧。有兴趣的博友们可以自己研究一下哦!

posted @   Flash_Hu  阅读(273)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
剑桥
17:14发布
剑桥
17:14发布
5°
西风
7级
空气质量
相对湿度
34%
今天
多云
-3°/5°
周六
-1°/3°
周日
-2°/7°