后缀数组和后缀自动机模板
原文:https://oi-wiki.org/string/sa/
后缀数组
下面说的都是倍增法实现。
字符串下标都从 1 开始。
算法作用:
在\(O(nlogn)\)的时间复杂下实现
后缀数组有两个关键的数组:
-
sa[i]表示将所有后缀排序后第 i 小的后缀的编号
-
height[i] 表示 sa[i]和 sa[i−1]的最长公共前缀(的长度)。
height[1]是0
算法作用:
-
不同子串的数目
-
两子串最长公共前缀
-
从字符串首尾取字符最小化字典序
-
出现至少 k 次的子串的最大长度
-
是否有某字符串在文本串中至少不重叠地出现了两次
-
求一个串最多由哪个串复制若干次得到
-
重复次数最多的重复子串
后缀自动机 (SAM)
时间复杂度:\(O(n)\)
空间复杂度:\(O(n)\)
算法作用:
-
给一个文本串 T 和多个模式串 P,我们要检查字符串 P 是否作为 T 的一个子串出现
-
计算给定的字符串中有多少个不同的子串。
-
给定一个字符串 ,计算所有不同子串的总长度。
-
给定一个字符串S 。多组询问,每组询问给定一个数K ,查询 S的所有子串中字典序第 K 大的子串。
-
对于一个给定的文本串 S,有多组询问,每组询问给一个模式串 P,回答模式串 P在字符串 T 中作为子串
-
- T出现了多少次
-
- T出现的所有位置。
-
给定一个字符串 S 和一个特定的字符集,我们要找一个长度最短的没有在S 中出现过的字符串。
-
多个字符串间的最长公共子串