Manacher 算法学习笔记
Manacher 马拉车算法
一、概述与定义
-
马拉车算法是一种用来解决最长回文串等关于回文串长度问题的算法。
-
定义一个长度为奇数 回文串 的回文中心为 。
-
在此定义下,一个有回文中心的回文串必然是一个奇数。
-
定义一个长度为 的回文串 的回文长度为 。
二、做法
-
以字符串 为例
-
我们首先在字符串 的字符之间插入一个特殊字符 ,变成:
-
这么做的目的就是消除奇数长度字符串和偶数长度字符串的长度差别。可以观察到,一个以 为中心的回文串去掉 后就是一个偶数长度字符串,一个以字母为中心的字符串就是一个奇数长度字符串。不妨定义 为以 为回文中心的最长回文串的回文长度,那么 就是一个回文串的长度(具体是哪个回文串写出来会比较抽象,这里简略)。
-
我们再在首尾两端插入一个特殊字符串,以防止遍历的时候越界。定义刚刚没有插的时候的那一段字符串为有效段。
-
不妨假设 到 这一段中,末尾位置最后的回文串的末尾位置为 ,它是一个以 为中心的回文串,
-
对于 的情况,由于前面关于字符串的信息最多到 ,那么你木得任何办法,只能设置 ,然后首尾扩展。
-
对于 的情况,不妨假设 关于 的对称点为 ,注意到,一个以 为回文中心的回文串经过 对称后必然也会存在一个以其对称点 为回文中心的回文串,原因就是以 为回文中心的回文串对称后反了过来,变成了倒序,但依然是一个回文串。
-
显然,如果 超过了 ,说明以 为中心的字符串长度超过了 的“对称管辖范围”,是否对称还说不定。那么我们的信息最多也就到 这里,剩下的只能靠暴力拓展了。而如果没超过,那半点问题都没有。
-
所以我们实现时可以这样
- 如果 ,那么 ,否则 。
- 暴力拓展:当 时, 加上 。
- 更新 ,如果 大于 ,那么 ,。
本文作者:邻补角の杂货铺
本文链接:https://www.cnblogs.com/sslbj/p/18743522
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步