有关回文树有很多很好的教程,比如poursoul的blog。
无限Orz 毛子提出神算法。
Orz iwtwiioi大爷的教程,popoqqq大爷的纠正
在此加深一下对于PAM的理论认识。
首先自动机要能【接受】所有的【满足条件的串】,这个PAM是肯定满足的,因为PAM的【每一个节点都是回文串】,而对于所有的【回文后缀】,我们用类似AC自动机的方法建立【连接】,因为考虑AC自动机fail指针的定义,我们沿着fail指针找到的是【最长的后缀】,而根据回文树的定义,回文树的每一个节点都是【极大回文串】,所以是可行的。
这究竟是不是【自动机】呢(⊙o⊙)?。
答案是肯定的XXXX。
考虑在PAM中,每一个点表示一个【回文后缀】,转移next[c]为从(S)转移到(c+S+c),这样我们可以在PAM的【状态图】上走出所有的回文串。(只不过每一个点【不一定】是代表了一个回文,【压缩】了状态)
然后深入探讨一下fail指针。
问:是怎么保证沿着fail指针找到的回文串是和【新加字符】连续的?
答:根据fail的定义,fail指向的是最长的后缀,由于是后缀,所以必然是连续的。
问:是怎么保证一定遍历过【最长的后缀】的?
答:自动机上每一个点都是一个回文串,而我们要找的是【之前出现的】【最长的】回文串,显然【所有的】回文串都在自动机上,而后类比AC自动机即可。
问:我会manacher,PAM是不是没有什么用?
答:PAM常数较大,编写复杂,但是其功能格外强大,可以支持在线,可以在自动机上dp,计数。但是PAM也不是万能的,manacher在有关回文半径的处理上是PAM无法替代的(反正我不会 囧)