算法学习:后缀自动机转后缀树转后缀数组
引入
其实这是一篇水文
想要学后缀自动机的话去查2012年noi冬令营陈立杰讲稿
顺便说一句,讲稿上有一些错误,多翻几篇博客加深理解。
今天这里主要要讲的是后缀自动机如何转后缀树和后缀数组
后缀树
这里首先需要提一下后缀树的概念
后缀树其实相当于把所有的后缀插入一颗Trie树
然而时空复杂度都是O(N^2)的
所以我们可以把这可Trie树上的某些边压缩一下
比如这样
这是一颗字符串banans的所有后缀组成的Trie树
这是一颗压缩后的Trie树,也就是后缀树
(图片来源于网络)
从后缀自动机到后缀树
其实操作非常简单,就是把字符串倒序插入后缀自动机,形成的parent树就是后缀树
证明的话,考虑一对parent树上的父子关系。
AAAAxAAAAxBAAx
考虑这样一个字符串
考虑串AAAAx和AAx
显然AAx是AAAAx parent树上的父亲
我们发现,AAx是AAAAx的后缀
我们考虑parent树上从叶子节点到根的路径。
每个节点表示的字符串长度集合[Min(s),Max(s)]越来越小,而且我们还会发现,父亲一定是儿子的后缀。并且儿子的Right集合是父亲的真子集。也就是父亲可能作为别的儿子的后缀
这个时候我们对比后缀树。
仍然是考虑一条从叶子节点到根的路径,我们会发现父亲一定是儿子的前缀。并且一个父亲可能作为很多个儿子的前缀,比如上面例子中的AAx可以作为AAAx&#x