自动机上的字符串匹配

字符串自动机通常有些共性,尤其是在匹配上。

这里记一些带 fail 树和 ch 边(DAG)的自动机的共性。可以从匹配的角度理解这些自动机。

在匹配上,它们通过跳 ch 边来尾加,在无法尾加时通过跳 fail 边来尽可能维护“后缀”匹配,继续尝试尾加。

本质类似双指针(PAM 较特殊,但差不多),两个指针是最大匹配段的左右端点。

一些时候直接跳 fail 即可保证复杂度。但有时我们需要压缩路径来降低复杂度或简化过程。

压缩路径:将尾加一个字符时跳 fail 和跳一步 ch 的过程一起压到 ch 里,保证了尾加一个字符时只跳一步。

另外一个套路是在 DP 时并不压缩路径,而是每一步统一跳一遍 fail,这样好像能省去一个字符集大小的时间复杂度。

Trie

传统艺能。

KMPAM

分是否压缩路径。

border 即仍然匹配的前缀,KMPAM 维护的是后缀与前缀的匹配。

ACAM

分是否压缩路径。

相当于广义的 KMPAM,ACAM 维护的是后缀与所有字符串的前缀的匹配。

这一点决定了 ACAM 不好在线构建,一般离线 BFS(按层)构建。

SAM

分是否压缩路径。

虽说是后缀,但其实维护了所有子串,且按本质区分。

SAM 是 KMPAM 的加强版,维护了后缀与所有子串的匹配。

GSAM

此处内容存疑。

分是否压缩路径。

广义 SAM,维护了后缀与所有字符串的所有子串的匹配。

PAM

分是否压缩路径。

较特殊(双向扩展,并非传统的双指针),但是结构也很相似。

维护了所有回文子串,且按本质区分。

维护了后缀与所有回文子串的匹配。

子序列自动机

我还不太会用它来做匹配。

2025.5.1

posted @ 2025-12-11 11:51  FirCone  阅读(1)  评论(0)    收藏  举报