后缀自动机
Posted shanxieng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后缀自动机相关的知识,希望对你有一定的参考价值。
我就抄抄论文好了
有限状态自动机其实是一个单词的有向无环图,图中包含了一个起始状态和一个结束状态集合,有向图的边上赋有权值。有限状态自动机的功能是识别字符串。
自动机由五个部分组成,alpha:字符集,state:状态集合,init:初始状态,end:结束状态集合,trans:状态转移函数。
不妨令trans(s,ch)表示当前状态是s,在读入字符ch之后,所到达的状态。
如果trans(s,ch)这个转移不存在,为了方便,不妨设其为null,同时null只能转移到null。
null表示不存在的状态。
同时令trans(s,str)表示当前状态是s,在读入字符串str之后,所到达的状态。
那么自动机A能够识别的字符串就是所有使得(trans(init,str)subset end)的字符串str,令其为Reg(A)。
从状态s能够识别的字符串就是所有使得(trans(s,str)subset end)的字符串str,令其为Reg(s)。
后缀自动机就是能够识别一个字符串的全部后缀的自动机,而如果直接构建后缀自动机复杂度将达到(O(n^2))。
最简状态后缀自动机就是状态数最少的能够完成上述功能的自动机,其状态数为线性。假设我们得到了这个最简状态后缀自动机,简记为SAM。
我们令ST(str)表示trans(init,str),就是初始状态读入str后能够到达的状态。
令母串为S,它的后缀集合为Suf,它的连续字串集合为Fac。
从位置a开始的后缀为Suffix(a)。
S[l,r)表示S中[l,r)这个区间构成的子串。下表从0开始。
对于一个字符串s,如果s不属于Fac,那么ST(s)=null。因为在s后面加上任何字符都不是S的后缀了,我们要求状态最少,所以没有理由浪费空间。
同时如果s属于Fac,那么ST(s)!=null,因为s既然是S的子串,那在s的后面加上一些子串,一定可以构成一个后缀。
我们不能对每个子串都新建一个状态,因为这样状态数是n方的。
我们考虑ST(a)能识别哪些字符串,即为Reg(ST(a))。
字符串x能被自动机识别,当且仅当(xin Suf)。
ST(a)能够识别字符串x当且仅当(axin Suf),因为已经读入了a了。
也就是说ax是S的后缀,所以x也是S的后缀。Reg(ST(a))是一些后缀集合。对于一个状态s,我们唯一关心的就是Reg(s)。
以上是关于后缀自动机的主要内容,如果未能解决你的问题,请参考以下文章