登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Manacher 算法学习笔记 & 详解,一文带你彻底看懂 Manac ...
Manacher 算法学习笔记 & 详解,一文带你彻底看懂 Manacher。
[ 复制链接 ]
凤清昶
4 天前
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
背景
给定一个字符串,请求出它的最大回文子串的长度。
第一种做法是暴力做法,也称中心扩展法。操作逻辑是我们枚举每个可能的对称中点 \(i\) ,以它为中心向两边扩展,并更新答案。显然这个做法是 \(\mathcal O(n^2)\) 的。
第二种做法是二分 + 哈希。通过预处理,我们可以在 \(\mathcal O(1)\) 的时间内比较任意两个子串。又观察到答案具有单调性,我们再二分可能的答案一一验证。显然这个做法是 \(\mathcal O(n\log n)\) 的。
但是,事实上我们有一种极为优秀的算法:Manacher 。这种做法可以做到在 \(O(n)\) 时间内解决上述问题,并且编码压倒性地简单。
预处理
我们知道,回文串有奇偶之分,偶回文串不存在中心点。为了方便,我们采取一种简单的技巧统一这些情况。
具体地说,我们在每两个字符之间,以及原串的首尾分别加入一个不属于原串的字符作为分隔符(如 # )。比如,abba 会变成 #a#b#b#a# 。显然,这并不会影响回文性质。同时,我们还在这个串的首尾额外加入两个不同的特殊字符来标记边界(如 @ 和 $ ),具体作用后文会解释。这样,原串就变成了 @#a#b#b#a#$ 。不难发现,经过这样处理,所有回文串都变成了奇回文串。后文所有讨论都基于奇回文串进行。
算法思路
Manacher 算法应用了回文串的一个重要特性:对称性。
还是需要遍历所有对称中心 \(i\) 。我们定义 \(p_i\) 表示以字符 \(s_i\) 为中心的最长回文子串的半径,\(c\) 表示目前找到的最大回文子串的对称中心,\(r\) 表示目前找到的最大回文子串的右端点。由于我们进行了预处理,所以有 \(ans = \max(p_i-1)\) 。问题是如何快速计算出 \(p_i\) 。
中心扩展法低效的原因是有大量重复的检查。如下图,当我们已经得到了以 \(s_c\) 为中心的回文,即阴影部分,当我们计算它右边的 \(s_i\) 时,完全可以由已经算过的 \(s_j\) 对称得到,即虚线部分。并不需要再算一次。
看起来,我们只需要一点小优化就可以了。但是,实际上并不这么简单。事实上,我们会遇到如下三种情况:
<ol>我们遍历到 \(i\ge r\) ,这时以 \(s_i\) 为中心的回文的镜像并不在记录范围内,其对称性是未知的。这时,我们只好先令 \(p_i=1\),然后使用中心扩展法求 \(p_i\) 。求完后,记得更新 \(r\) 。
我们遍历到 \(ia; s = change(a); cout
Manacher
算法
学习
笔记
amp
相关帖子
监督微调 SFT 学习笔记
监督微调 SFT 学习笔记
监督微调 SFT 学习笔记
监督微调 SFT 学习笔记
3分钟搞懂深度学习AI:实操篇:卷积层
3分钟搞懂深度学习AI:实操篇:池化层
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
科技
监督微调 SFT 学习笔记
0
921
舒菀菀
2026-03-09
科技
监督微调 SFT 学习笔记
1
959
韶又彤
2026-03-09
科技
监督微调 SFT 学习笔记
0
51
咪四
2026-03-09
科技
监督微调 SFT 学习笔记
0
678
予捻
2026-03-09
业界
3分钟搞懂深度学习AI:实操篇:卷积层
0
510
类饲冰
2026-03-09
业界
3分钟搞懂深度学习AI:实操篇:池化层
0
213
事确
2026-03-11
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
科技
签约作者
程序园优秀签约作者
发帖
凤清昶
4 天前
关注
0
粉丝关注
18
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991125
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
韶又彤
9912
6
宋子
9880
7
闰咄阅
9993
8
刎唇
9995
9
蓬森莉
9869
10
遗憩
10006
查看更多
今日好文热榜
211
3分钟搞懂深度学习AI:实操篇:池化层
30
Gemini 3.1 Flash-Lite 正式上线:专为规模
246
【OpenClaw】博查搜索 Skill 正式上线|中
341
FastAPI + PostgreSQL 实战:从入门到不踩
685
MAUI 嵌入式 Web 架构实战(七) 构建设备
906
AI时代,程序员都应该是需求描述工程师
234
openclaw平替之nanobot源码解析(二):age
828
当纺织机轰鸣而来——一个数字时代“纺织女
479
空论与时论
217
搭建数据库服务高可用架构
287
2026卫生高级职称备考:卫生高级职称考试历
30
公司新招了个 5 年 Java,开工第一天就被劝
333
opencalw平替之nanobot 源码解析(一):环
983
【节点】[SceneDepth节点]原理解析与实际应
419
【节点】[SceneDepth节点]原理解析与实际应
758
"给我发个200元红包":一条群消息背后的 AI
479
使用 C++ 模拟 ShaderLanguage 的 swizzle
71
006:RAG 入门-面试官问你,RAG 为什么要切
291
Stanford-CS336-Lecture-02 Pytorch
328
【FAQ】HarmonyOS SDK 闭源开放能力 —Push