【luogu P5496】【模板】回文自动机(PAM)(回文树)
【模板】回文自动机(PAM)
题目链接:luogu P5496
题目大意
给你一个字符串,要你对于字符串的每个位置,求有多少个回文串是在这个位置结尾的。
思路
为啥要用 PAM
首先我们想想处理字符串问题有什么方法:
KMP、AC 自动机
后缀数组后缀自动机
Manacher
哈希、DP、暴力等等。
但你发现如果要处理回文串的问题,哈希+二分复杂度太高,Manacher 只能针对整个串,在面对这样的题的时候,似乎没有什么办法。
于是,就有了一个叫做 PAM 的东西。
PAM 有啥用
它可以求一个字符串的某个前缀中出现了多少个不同的回文串。
统计在一个字符串中每个回文串出现的次数。
(也就是说它可以求回文串的个数)
它还可以求以下标 结尾的回文串个数,也可以得出有哪些。
咋搞
那你同最后一个用处多多少少都能看出来,它是类似 AC 自动机一样的东西,有一个 指针,指向的位置就是它失配之后跳转到的表示它最长后缀回文串的点。
然后接着它有一些数组:
表示第 个点表示的回文串的长度。
表示在第 个点表示的回文串两边都加 这个字符串形成的新回文串对于的点。(这个有点类似 Trie 数)
就是我们前面说的失配指针。
就是有多少个回文串的结束位置是它的结束位置。(这个就是用来求本题的答案啦)
在不处理的时候没有意义,在跑了 函数之后,它就表示这个回文串在字符串中出现了多少次。
就是以最后一个字符结尾的最长的回文串的编号。
有的时候,我们还会顺手维护一个 ,表示长度小于等于这个回文串的一半最长回文后缀。
回文树比较神奇的地方,就是它有两个根: 表示偶数长度的根, 表示奇数长度的根。
然后由于你可能跳 边跳到空字符串之后可能会由原来的偶数长度变成奇数长度,所以 。
然后我们设 ,至于为什么 我们在后面会发现它的好处。
然后考虑在当前的字符串后面加一个字符,考虑怎么搞。
那首先肯定是跳 边直到碰到可以匹配这个新字符串。
那你肯定会想如果一直都无法匹配,就要搞特判,但其实 可以让我们不用特判。
首先不难想到判断是否能匹配是看 是否等于 。( 是当前字符串长度, 是现在跳到的位置)
那如果一直无法匹配,就会跑到 ,那这个时候带进去看: 就是 即 ,所以自己肯定等于自己,就会跳出来。
接着就是匹配啦,那就会走到 ,那如果有了我们就不用管,但如果没有这个点,那我们就要新开一个点 ,并维护关系。
首先看 ,那就是从 左右两边都加了 这个字符,长度就加了 。
而且这个时候也不同特判,如果它自己一个形成回文串,那就是 ,刚好就是 。
接着你考虑维护 ,那跟 AC 自动机的维护方式一样,你先不断跳 边找到 可以匹配的,然后它两边加 这个字符对于的点就是 了。
接着就是连 ,这个就不多说了,。有的时候还要记录父亲,这个也没什么麻烦的,直接 即可。
然后是 ,那它其实就是比 多了一种回文串(它自己),所以就是 。
那接着是 ,那不难想到它也是类似 AC 自动机的匹配方式。
首先如果当前字符串的长度小于等于 ,那它要么长度是 ,要么是空,所以就直接 。
那如果长的,那我们就考虑继续跳 边,但是是从 开始跳。(因为你只是要一半,你从 开始跳就太慢了会超时)
那首先跳到的要能匹配 ,接着就是要加上两边的两个 字符之后长度还不超过当前串的长度的一半,那跳到就退出,然后它匹配上 形成的回文串对于的点就是我们要的了。
这里再讲讲 函数。
其实它就是从叶子到父亲不断的 DP 一下,因为如果一个 是 的子串, 是 的子串,那 是 的子串。
所以在代码上就是倒序枚举点,然后 就可以了。
这道题
其实就是每次插入点,然后输出 即可。
代码
__EOF__

本文链接:https://www.cnblogs.com/Sakura-TJH/p/luogu_P5496.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现