字符串乱记

基本概念

  • 文本串 \(S\), 模式串 \(T\), 通常来说就是在文本串找模式串。

kmp

  • 功能:求任意一个模式串在一个文本串出现的位置和次数。
  • 时间复杂度:\(O(|S|)\)
  • 主要信息:\(\text{next}\) 数组,记录某个位置 \(S_{1...i}\) 的最长 border。
  • 建造方式:增量法,跳所有 border 更新。
  • 注意点:最长 border 不能是自己。
  • 一般要么考匹配,要么考性质和 dp。

AC自动机

  • 功能:求任意一个模式串在多个文本串出现的次数。
  • 时间复杂度:建造 \(O(\sum|S|)\), 查询 \(O(|T|)\)
  • 主要信息:
    1. \(\text{trie}\) 数组,是AC自动机的转移函数。
    2. \(\text{fail}\) 数组,是失配函数,用于记录所有文本串中当前这个节点代表的字符串的最长 border。
    3. 构建出 \(\text{fail}\) 树,父亲节点是当前节点的后缀和最长 border。
  • 建造方式:先建出 trie 树, 在通过 bfs 序构造失配指针,和 kmp 差不多,只不过在树上。
  • 套路:
    1. 建出的 fail 树,对于一个串在 trie 上到根的节点,都是它的前缀,在这些节点在 fail 树上到根的所有节点,都是当前串的子串。
    2. 这两个树的信息一般有的操作是子树求和树上差分

manacher 算法

  • 功能:求文本串的每个位置的最长回文子串。
  • 时间复杂度: \(O(|S|)\)
  • 主要信息:
    1. \(f\) 数组,表示以某个位置为中心的回文半径的长度 + 1。
  • 建造方式:
    1. 利用当前最长回文串的对称来更新。
    2. 暴力更新。
  • 注意:一般在原串某两个字符内插入一个不存在的字符来解决长度是偶数的回文串长度。

pam 回文自动机

  • 功能:求文本串的所有回文串的信息。
  • 时间复杂度: \(O(|S|)\)
  • 主要信息:
    1. 转移函数,自动机必备。
    2. 长度,记录某个节点代表的回文串的长度。
    3. \(\text{fail}\) 指针,指向某个串的最长的后缀回文串。
  • 建造方式:
    1. 增量法,维护fail指针。
  • 注意:初始化两个节点,长度分别为 0 和 - 1, 表示偶回文串的树根和奇回文串的树根, fail[0] = 1。

sam 后缀自动机

  • 功能:强大,单串匹配,多串匹配(广义sam)它都行。
  • 时间复杂度:\(O(|S|)\)\(O(\sum|S|)\)
  • 主要信息:
    1. \(\text{endpos}\) 集合,表示一个串在文本出现的结尾位置, 一般只记录大小。
    2. \(\text{maxlen}\), 表示一个 \(\text{endpos}\) 集合内的最长的串的长度。
    3. \(\text{link}\), 表示指向包含当前\(\text{endpos}\) 集的另一个 \(\text{endpos}\) 集的位置。
    4. \(\text{parent}\) 树, 通过 \(\text{link}\) 连接起来的树,一个节点到根的所有节点都是当前结点的后缀。
  • 建造方式:
    1. 增量法,对于原来每个串的后缀新增一个新的字符。
    2. 在构建广义sam的时候要特判,不要多建空节点。
posted @ 2022-03-17 15:37  qjbqjb  阅读(26)  评论(0编辑  收藏  举报