manacher 算法
manacher 算法
作用
在的时间里求出以每个字符或者两个相邻字符之间为回文重心的回文串半径
算法流程
对于一个字符串
我们不妨在两个在字符中间加入一个不可能存在在字符串中的字符,在两边加入一些奇怪的字符,S`=!a#b#b#a#c#a#a#b#b#a@
这个操作十分的风骚,这样可以将以上两种情况合并在一起。
不妨定义数组 为以为中心最长回文串的半径。
不妨定义mx
为目前找到的回文串的最右端。
不妨定义mid
为目前最右回文串的回文中心
易得
我们假设我们已经将 求出,将要计算 我们该怎么办?
所以我们可以先得到
当然有个前提
但是其还有可能想外扩张,所以还要再加上一句(这个好似木有前提,就是个暴力):
while(S[i-p[i]]==s[i+p[i]]) p[i]++;
然后还要再更新一下
大体就是这样,那先放一下代码。
CODE
char a[maxn];
int mx,mid,p[maxn];
inline void manacher(){
for(int i=1;i<=la;i++){
if(i<=mx) p[i]=min(mx-i,p[mid*2-i]);
while(a[i+p[i]]==a[i-p[i]]) p[i]++;
if(p[i]+i-1>=mx) mx=p[i]+i-1,mid=i;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效