后缀自动机 笔记

后缀自动机是一棵Trie树,用于建立字符串集合与其Right集合的对应关系。文章介绍了后缀自动机的构造方法,包括parent树和trans矩阵,并讨论了其在求解子串出现次数问题中的应用。通过拓扑排序和动态规划,可以计算出每个状态对应的Right集合大小,进而找到长度为x的子串最大出现次数。
摘要由CSDN通过智能技术生成

参考了hihocoder和clj的课件,看了看hzwer的代码,懂了些东西,记一下。

  1. 后缀自动机是一棵trie树

  2. 给出一个字符串S,对于S的一个子串s,Right(s) 代表一个集合,为s在S中所有出现的结束位置集合。
    以S=”aabbabd”为例,Right(“ab”) = {3, 6},因为”ab”一共出现了2次,结束位置分别是3和6。同理Right(“a”) = {1, 2, 5}, Right(“abba”) = {5}。

  3. 对于一个字符串集合,若这个集合中所有的字符串拥有相同的Right集合,那么我们可以给这个集合一个状态s, 用Substring(s)代表这个集合,这个集合也对应着一个Right(s)集合。

那么现在就存在一个s <-> Substring <-> Right集合的一一对应关系。

对于Substring(s),存在longest(s)和shortest(s)分别代表Substring(s)中的最长和最短字符串,其长度分别为l(s)与r(s)。

对于一个longest(s),我们不断地去除他的第一个字符,直到其变为shortest(s),这个过程中出现的l(s)- r(s) + 1个字符串必然都属于Substring(s)。

若我们将shortest(s)的第一个字符删去(此时当然是假定shortest(s)不为空串),必然会导致状态的改变,因为此时的Right集合变大了,而s和Right(s),Substring(s)一一对应。

具体可以参照下图。
这里写图片描述

我们用fa(s)来代表从s进行的一次跳转到达的新状态。

若把状态按fa来建图,显然可以得到一个树形结构,我们称之为parent树。
CLJ课件附图

对于这棵树存在以下性质:
1. max(fa(s))=min(s)1 m a x ( f a ( s ) ) = m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值