“三机”学习笔记

“三机”学习笔记

概述

三机指的是 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 图。

代码实现

posted @ 2025-08-07 15:48  邻补角-SSA  阅读(29)  评论(0)    收藏  举报