后缀树 后缀数组

本文深入探讨了后缀树和后缀数组的概念,分析了后缀树的性质,如节点表示串的出现次数相同,以及如何通过后缀树解决字典序相关问题。同时介绍了后缀数组的构建方法及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后缀树

我们考虑将一个串的所有后缀插入一个trie中,得到的trie就是后缀trie。我们可以发现,树上有分叉或者是后缀节点的点的个数是O(len)O(len)O(len)个,这个后面解释,于是把没有分支并且不是后缀节点的点压缩到一起,就变成了后缀树。

不难发现,后缀树可以表示该字符串的所有子串。

下面分析一下后缀树的一些性质

  1. 后缀树一个节点表示的串出现次数相同。(不然为什么能缩到一起)。

  2. 后缀树按照‘a’ - ‘z’遍历得到的dfs序就是将原串所有子串按照字典序从小到大排序得到的序列

有人会问,为什么有后缀树,没有前缀树?我只能说,呵呵

构造

不会正常的O(nlogn)​O(nlogn)​O(nlogn)构造,但是我们可以通过构造后缀自动机来构造,实际上我们知道,一个串后缀自动机的parent树,实际上就是其反串的后缀树,由于后缀自动机节点是O(len)​O(len)​O(len)的,所以后缀树节点也是O(len)​O(len)​O(len)的。

利用后缀树可以轻松的解决一些与字典序相关的问题,这里随便说一下,比如查询字典序排第k大的是那个,很明显,二分。如果查询某个串的排名,先走到对应节点,然后看这个节点的dfs序之类的就可以了。

后缀数组

我们将所有后缀排序,得到一个序列,设为sa,sa[i]表示排名为i的串是那个后缀,由于后缀长度互不相同,所以排序结果唯一。后缀排序可以通过刚才建后缀树的方法,可以不去写网上常见的倍增做法。

再定义height[i]=lcp(S[sa[i−1],n],S[sa[i],n])height[i] = lcp( S[sa[i - 1] ,n] , S[sa[i] , n] )height[i]=lcp(S[sa[i1],n],S[sa[i],n]),以及rnk[i]=后缀i的排名rnk[i] = 后缀i的排名rnk[i]=i

我们可以知道height[rnk[i]]≥height[rnk[i−1]]−1height[rnk[i]] \geq height[rnk[i-1]] - 1height[rnk[i]]height[rnk[i1]]1,然后就可以计算height了。至于有什么用,主要用处就是heightheightheight
但是博主太菜,没找到什么只能用后缀数组,而不能用后缀树或者后缀自动机搞的题目,或者用后缀数组明显好做的题目,望有人告知博主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值