后缀数组和后缀自动机模板

原文:https://oi-wiki.org/string/sa/

后缀数组

下面说的都是倍增法实现。
字符串下标都从 1 开始。
算法作用:
\(O(nlogn)\)的时间复杂下实现

后缀数组有两个关键的数组:

  • sa[i]表示将所有后缀排序后第 i 小的后缀的编号

  • height[i] 表示 sa[i]和 sa[i−1]的最长公共前缀(的长度)。
    height[1]是0

image

算法作用:

  1. 不同子串的数目

  2. 两子串最长公共前缀

  3. 从字符串首尾取字符最小化字典序

  4. 出现至少 k 次的子串的最大长度

  5. 是否有某字符串在文本串中至少不重叠地出现了两次

  6. 求一个串最多由哪个串复制若干次得到

  7. 重复次数最多的重复子串

后缀自动机 (SAM)

时间复杂度:\(O(n)\)
空间复杂度:\(O(n)\)
算法作用:

  1. 给一个文本串 T 和多个模式串 P,我们要检查字符串 P 是否作为 T 的一个子串出现

  2. 计算给定的字符串中有多少个不同的子串。

  3. 给定一个字符串 ,计算所有不同子串的总长度。

  4. 给定一个字符串S 。多组询问,每组询问给定一个数K ,查询 S的所有子串中字典序第 K 大的子串。

  5. 对于一个给定的文本串 S,有多组询问,每组询问给一个模式串 P,回答模式串 P在字符串 T 中作为子串

    • T出现了多少次
    • T出现的所有位置。
  1. 给定一个字符串 S 和一个特定的字符集,我们要找一个长度最短的没有在S 中出现过的字符串。

  2. 多个字符串间的最长公共子串

posted @ 2022-08-10 15:12  kingwzun  阅读(112)  评论(0编辑  收藏  举报