Manacher 学习笔记
一、引入
首先我们需要知道的是
一个通用的问题模型是给定一个长度为
我们知道的是,对于任意一个回文串
现在我们的问题就是快速求出
二、算法
我们先考虑
既然这样,在求
现在考虑计算
- 若
,暴力匹配; - 若
:
由于
考虑复杂度分析:
现在考虑
考虑在原字符串每个字符的两侧都插入一个其它字符,这样一来所有回文串都可以归约到奇数串的情况,例如 aba
a#b#a
,abba
a#b#b#a
。对于多统计的情形,容易得到关系
给出代码:
void manacher() {
int l = 1, r = 0;
for (int i = 1; i <= n; i++) {
int k = (i > r) ? 0 : min(d[l + r - i], r - i + 1);
while (i + k <= n && i - k >= 1 && equ(s[i - k], s[i + k])) ++k;
d[i] = k--;
if (i + k > r) l = i - k, r = i + k;
}
}
三、应用
应用典型是求最长回文子串。对于长度为奇数的回文串,最长的长度是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!