后缀自动机

我就抄抄论文好了

有限状态自动机其实是一个单词的有向无环图,图中包含了一个起始状态和一个结束状态集合,有向图的边上赋有权值。有限状态自动机的功能是识别字符串。

自动机由五个部分组成,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)。

原文地址:https://www.cnblogs.com/shanxieng/p/10050237.html