快速构造后缀自动机

参考资料

SUFFIX AUTOMATON by saisumit(可能要科学上网一下):
https://saisumit.wordpress.com/2016/01/26/suffix-automaton/

一点补充

我觉得原文中对于为什么要新开一个节点讲得还不是很透彻.
考虑新建一个节点u时, 我们一直往上跳suffix link, 到了\(lst\)节点. 我们发现\(lst\)已经有一个出边\(c\), 因此要进行特殊处理:

  • 假如可以直接将\(u\)的suffix link设为\(p\), 则根据suffix link的定义, 有\(minlen(u) = len(p) + 1\). 又因为\(minlen(u) = minlen(x) + 1 = len(lst) + 2\)(\(x\)\(u\)有连边, 因而\(minlen(u) = minlen(x) +1\); 又因为\(lst\)\(x\)的suffix link, 因此\(minlen(x) = minlen(lst) + 1\)), 所以有\(len(lst) + 2 = len(p) + 1\), 所以有\(len(lst) + 1 = len(p)\)
  • 反之, 假如\(len(lst) + 1 < len(p)\), 则有\(u\)的suffix link不为\(p\), 需要新建一个\(len(q) = len(lst) + 1\)的节点.
posted @ 2017-07-05 19:21  Zeonfai  阅读(108)  评论(0)    收藏  举报