用途
可以储存所有的回文串,也可用于向末尾插入新节点时动态维护最长回文串。
思维过程
观察可以发现,如果 \(x \sim i\) 形成回文串,那么 \(x+1 \sim i-1\) 必须为回文串。
对于任意一个已经确定是回文串的 \(x+1 \sim i-1\) 进行单次匹配,只需要比较 \(s[x]\) 和 \(s[i]\) 是否相等即可。
对于新插入的节点 \(i\),找到 \(1 \sim i\) 的后缀的最长回文,模仿 KMP 的方式,进行如下操作:先试着和 \(1 \sim i-1\) 后缀的最长回文匹配。如果已经成功匹配了那不用说;如果失败了,就试着与 \(1 \sim i-1\) 后缀的次长回文匹配,还不行就与 \(1 \sim i-1\) 后缀的次次长回文匹配,直到匹配成功或后缀已经是空串了。
那么,是不是可以像 KMP 那样,对于每一个节点 \(i\),记录一下它后缀的最长、次长回文分别的位置,就可以快速在这些后缀间跳跃了?可以发现,这其实是不能直接实现的。最主要的问题是“次长的次长”的位置并没有在先前被计算过,更本质的原因是,它似乎并不是任何节点的最长后缀回文。
但是来观察一下这幅图:
标签:匹配,后缀,笔记,sim,自动机,节点,次长,回文 From: https://www.cnblogs.com/David-Mercury/p/18000985