作为蒟蒻很羞耻的不会后缀自动机 于是去学 然后会发现blog已经被后缀自动机刷屏了 我学的SAM姿势有点奇怪
学习资料
最初是在这里学的 SUFFIX AUTOMATON by- saisumit
业内公认的是这个 MAXimal :: algo :: Суффиксный автомат. Построение и применения
有关后缀树看fhq 后缀自动机与线性构造后缀树
题目照着这个刷的 后缀自动机总结
广义后缀自动机 广义后缀自动机与后缀树 用SAM建广义后缀树
后缀自动机有两个本质
一是一个自动机 从起始状态出发的任意路径是一段子串 可以根据拓扑序做一系列DP 最常见的就是统计right集合的大小
一是一棵parent树 正式论文里称后缀链接形成的一棵树 其实就是反串的一颗后缀树 所以也有人说后缀自动机就是后缀树 树上也可以维护一堆值
后缀自动机的时空复杂度都是
O(n)
的 这个CLJ的讲稿里证明的很清楚了 证明的关键在于两个点的right集合 要么不相交 要么包含 形成一棵树结构
这个从代码里也不难看出 代码简短犀利 就算硬背也不算难
后缀自动机每个状态只要存储link len next[K] 分别表示 后缀链接 最大长度 自动机上的儿子 每个状态代表以right集合每个元素为结尾的长度为len[fa[x]]~len[x]的子串
后缀自动机的应用有很多
- Number of different substrings of a given string .
- Total length of various substrings.
- Lexographically kth substring.
- smallest Cyclic shift.
- No. of occurrences of a pattern in the given Text.
- Position of all Occurrences.
- Longest common substring.
- Longest Common substring of multiple substring.
- Search for shortest substring that is not included in this string.
来自 SUFFIX AUTOMATON by- saisumit
其实就是一系列关于 子串 是否出现 出现次数 的问题
广义后缀自动机就是可以识别多个串的后缀的自动机 或者说 识别一颗trie树的自动机 建法和单串后缀自动机基本一样 网上模板有很多
具体一系列证明lyy的论文很详细 没有仔细看
很经典的应用的CLJ的ZJOI题 诸神眷顾的幻想乡