【后缀自动机】 初学

首先膜拜clj的ppt,记录几个要点

关于Right集合:

    1.定义:一个子串str在母串S中所有出现位置的右端点。如子串str在S中出现位置为[l1,r1),[l2,r2),...,[ln,r3),则str的Right集合为{r1..rn}。会有一些子串的Right集合相同,其中最长的len为MAX(s),最短的为MIN(s)

    2.性质1:给定Right(s)和len就可得出串

    3.性质2:关于相交。如果Ra和Rb相交且不相等,那么Ra和Rb表示的子串一定不相交,否则两者的Right集合一定相同,不符合假设。那么设MAX(a)<MIN(b)。设r既在Ra中也在Rb中,那么必然a的子串都是b的子串的后缀。因此b出现的地方a一定出现,a出现的地方可能就没有b的位置了。所以Rb∈Ra。这个clj是不是讲错了?%>_<%

关于Parent树:

    1.x为s的父亲节点当且仅当Right(s)∈Right(x)且Right(x)最小。可以证明MAX(x)=MIN(s)。我们发现parent树是树形结构而且父节点至少有两个子节点然后就可以证明点是O(N)的了好像。。?

    2.边数O(N)貌似没看懂。。。。先挖坑。。。。。o(╯□╰)o

关于构造:

    1.第一步:在后缀T后插入x,设T为[0,L),那么必有一个Right集合为{L},令它为p,设它的父节点,父节点的父节点依次为v1,v2...vk,vk==root。

    2.链接新点:如果对于一个vi,它的Right里面这有S[rn]==x,那么直接在这个节点后面连上新点。如果vi的RIght集合里面除了rn还有S[rj]==x,那么它的祖先一定都有。这时我们不能直接插入,要分情况讨论

    3.讨论:假设在vp后插入q,其中q为在vp状态加入x转移到的状态。如果max[vp]+1=max[q],即所有以vp结尾的子串都会转移到q处,直接q把作为新节点即可。否则:我们新建一个点,把信息复制一份,在链接上去就行了。

    4.最后:对于新点np,把所有直接把p变成新状态的trans(vk,x)变为np


ppt讲完了。。好像还不太懂啊。。。诶人太弱被教做人了QAQ


2015.8.13

by lych

你可能感兴趣的:(字符串,后缀自动机)