回文自动机(PAM)

两年多前学的,但一直没做过题所以忘完了,回来补一下。

和 SAM 类似,我们希望把所有回文串建到一个自动机里面。增量构造,每次加入一个点,则需要考虑所有回文后缀。这时候会发现一个严肃的事情:如果存在两个后缀,那短的那个根本不是新的,可以用长的那个跳到前面取,只需要管那个长的就行了。

现在只需要找到 \(s[1\dots i-1]\) 的最长合法(因为要能和 \(i\) 适配)回文后缀就行了。最长回文后缀?是不是很像 fail 指针或者 kmp 的 next 数组?那就维护这个东西。令 \(i-1\) 所在节点为 \(cur\),即 \(s[1\dots i-1]\) 的最长回文后缀,但是有了 \(s_i\) 的限制,那么需要在 \(cur\) 的基础上不断跳 fail 直到能与 \(s_i\) 适配,在这个点上连一条 \(s_i\) 的边即可。那就做完了,几乎就是一个类似于可持久化 kmp 的东西。

不过有点小问题,就是边界以及长度的奇偶性可能有点问题。可以考虑建两个长度分别为 \(0,-1\) 的点,特别的,长度为 \(0\) 的点的 fail 指针连向长度为 \(-1\) 的点。

posted @ 2026-08-31 20:51  今天你学废了么  阅读(6)  评论(0)    收藏  举报