Sam

发布时间 2023-07-27 23:31:27作者: 颈流推进

将每一个子串归入一个二元组 \([x\,,\,y]\) 中,其中 \(x\) 代表其可能的长度,而 \(y\) 代表其右端点的集合,这就是 等价类 理论,正是因为以右端点作为基准,所以叫做后缀自动机

这里来感性证明一下为什么等价类的数量是 \(O(n)\)

回想一下 sam 的构建过程,我们将等价类不断划分,最后形成了 parent

一开始,所有的单字母后缀都是一个单独的等价类,然后我们对于一个单字母的等价类向前扩展一位

这里出现了两种情况,第一种,如果所有的子串还是一模一样的,他们就还呆在一个等价类里面,只要让这个等价类的可能长度加一下就可以了

如果不一样了,这时右端点集合有差别了,就需要分裂,根据不同的子串,分裂为不同的等价类就可以了

很明显,这里的分裂弱于一颗完全二叉树(因为有些扩展着就没有可以扩展的了),而且叶子结点的个数上限也才是 \(n\) 个,所以 parent 树的节点个数上限是 \(2n-1\)