考虑构建一个后缀自动机(Suffix Automaton)
设当前已构建的字符串为T, 要添加新字符x, T的长度为L
设p为从init输入串T所到的状态 即满足Right(p) = {L}的结点p,
令np表示从init输入串Tx所到的状态
Vp为p在parent树的祖先{V1, V2, ......, Vk = root}中第一个有x的转移的状态
q = trans(Vp, x)
分三种情况
<1> 并不存在Vp结点, 则par(np) = root
<2>满足Max(q) = Max(Vp) + 1, 则par(np) = q
<3>Max(q) > Max(Vp) + 1
新建一个节点nq, 使Right(nq) = Right(q) U Right(np) = Right(q) U {L + 1}
则 Max(nq) = Max(Vp) + 1
par(nq) = par(q) , par(q) = par(np) = nq
从新状态nq出去的转移同q出去的转移
即 trans(nq, c) = trans(q, c)
同时{Vp, ......, Vk = root}中转移到q的状态应转移到nq
trans(Vp...k, x) == q ? trans(Vp...k, x) = nq : ;
注: SAM构造的线性性、正确性证明以及运用详见《2012年noi冬令营陈立杰讲稿》
关于后缀自动机的构造
最新推荐文章于 2020-08-19 23:07:48 发布