“三机”学习笔记
“三机”学习笔记
概述
三机指的是 AC 自动机(ACAM),后缀自动机(SAM),和回文自动机(PAM)。
它们都用于解决字符串的相关问题。
定义
- 字符串 \(s\) 的第 \(i\) 个字符是 \(s_i\),第 \((l,r)\) 个字符组成的子串是 \(s(l,r)\)。
- 字符串 \(s\) 的长度是 \(\left|s\right|\)。
AC 自动机
概述
AC 自动机用于求解 \(n\) 个模式串匹配一个文本串的问题。
本质上是在 Trie 上进行一个类似 KMP 的过程。
过程
总体
先对模式串建出 Trie。
接着我们需要构建 fail 指针。当文本串匹配到这一个点而不能继续往下匹配之后,我们参考 KMP 的思路,保留尽可能多的匹配信息。因此我们需要找到从根到当前结点所组成的串 \(s\) 在 Trie 中的最长后缀。
我们建立一个指针,由当前结点指向那个后缀所在的结点。这个指针被称为 fail 指针。
匹配
- 我们对于某个文本串,先在 AC 自动机上跳点,当下一步要走一个不存在的边之后,就跳 fail 指针直到下一步能走。
- 当走到 Trie 上的一个结点时,如果上面有模式串结尾标记,则统计答案。
构建 fail 指针
- 对于一个结点 \(u\),考虑从这里走字符 \(c\) 到子结点 \(v\) 的情况。
- 如果到 \(v\) 无法匹配时,我们可以跳父亲的 fail 指针,将其 \(v\) 的 fail 指针指向父亲 fail 指针的对应字符 \(c\) 的子结点。
- 在代码实现时,常常使用 BFS 来求。对于结点 \(u\),遇到“要走字符 \(c\) 对应的子结点却无法走,要跳 fail”这种情况,在代码实现时,我们直接将其代表这个子结点的指针指向 \(u\) 的 fail 指针对应的子结点指针(这样子连完后就可以直接跳不需要考虑 fail)。
- 特别地,这种连接方式本质上改变了 Trie 树的结构,因此被称为 Trie 图。

浙公网安备 33010602011771号