[后缀自动机]小结

你问我参考什么学习的,我只能回答说无可奉告
https://wenku.baidu.com/view/90f22eec551810a6f4248606.html

以下内容仅仅是我的一点理解,如果报道上出现了偏差,我也不会被续1s的

显然证明法

sam上面不是有一段trans[u][x]=0的,然后就直接trans[u][x]=np,np是新建点,然后有一个q,他trans[u][x]有值了,但是你又要让这个q识别Sx,假设p=trans[u][x],因为又不能把trans[u][x]直接顶掉,那样信息肯定错了,就考虑把p和np弄一个parent关系,但是直接弄得话又可能不满足right数上的max限制,就需要再新建一个点,让他是np和p的parent,就重新满足了right树的限制了(max和right集合的子集关系),因为p被新建的点代替了,所以再把他的父亲的trans是p的改成这个点。

这个显然证明法可以拿来背板子(雾)

脑补之后

我当时一直没有清楚的地方就是trans。当时一直思考的问题是为什么parent np != ST(S),明明ST(s)是可以识别Sx的。但是其实一个点是可以识别很多东西的(字符集大小)。并且parent和trans一点关系都没有,parent的定义是right集合包含当前点,且right集合最小的。当前串对应的那个节点的right只有 length。一个状态对应了若干个子串,出现的末位置就是right,可以用right-min ,right - max来表示出这些子串可能的开始位置,而ST(S)虽然可以识别Sx,但他的right集合仍然不会变。考虑表示的什么样的串right集合会变,一是他是S的后缀,然后他的sr[right]有一个是x。这样的话他的trans[x]就可以在right集合中增加一个length+1(显然我们的right集合是只会增加的),这个的话cls的ppt里面有举例子可以自己看。但是你直接在right集合里面增加length+1是错的,因为他的max可能会变小。那你为了维护parent树上right集合的性质的话,就必须新建一个点,使得这个点的max仍然是满足的,然后p和np挂到新建的点下面去。这样就能维护好了。容易发现这样转移到的状态仍然是等价的。

怎么使用sam还没想清楚。等做几道题再补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值