回文自动机学习笔记
回文自动机学习笔记
比赛 T1 有这么这么一道回文自动机上 DP 的题,虽然这道题可以暴力+剪枝硬跑过去,但本着改题要用最优解的思想,我们还是花了半个晚上+半个早上学习了回文自动机。
【模板】回文自动机(PAM)
先做板题!
题意:对长度为
S 的字符串的每个位置求出以该位置结尾的回文串个数,强制在线。1 \le S \le 5 \times 10^5
回文自动机,又称回文树,就是用来在线性时间解决这种回文串的问题的一类高效的工具。
下面我们来讲一下回文自动机的工作原理:
工作原理
回文自动机 的工作原理类似于 AC自动机 ,都是运用前面求出的信息快速的求出新加入的字符的信息。
但不一样的是,回文自动机的每一个节点所代表的是半个回文串,这样不仅省空间,还能更快的判断是否有重复回文串。
但我们发现长度为奇数的回文串(下面简称奇串)和长度为偶数的回文串(下面简称偶串)的对称不太一样,所以我们开两个回文自动机,一个存奇串,一个存偶串,两个的根节点分别记为
例如下图:
节点6所代表的回文串就是
相信你也发现了,一个节点所代表的回文串就是从这个节点走到根节点再走回来的路径上的字符集。
建树
设回文树上的第
我们考虑递推,假如我们前
我们可以记一个指针
假如说我们的运气非常好,新加入的
但是我们容易发现,我们的运气经常不是很好,接不上,那怎么办?。
这时候,我们就要知道回文树的精髓了,fail指针!
fail 指针
其实自动机的
而回文树的
像刚刚上面的那张图,如果我们把
蓝边就表示的是
注意,
当我们接不上的时候,我们就可以跳
跳
好的,我们已经发现
我们同样可以借鉴
一些问题
- Q:会不会存在在计算新加入的点的
fail 指针时,发现对应点后没有对应的儿子的情况? - A:不会。如下图:
图中黑色方框指的是
- Q:回文串重复了会怎么样?
- A:不会怎么样,可以发现回文串重复的话,
fail 指针是不会变的。
总结
递推,一个个加入新节点,每加入一个新节点就先跳
不对,是不是忘记板题了?
其实板题就是用刚刚的方法在线建出一棵回文树,同时我们发现如果将
例题
洛谷P4287
GMOJ4752
参考资料
回文树 - OI Wiki
回文自动机