最近发现我字符串很菜(你这话不对,你不是上个学期就已经是整个机房字符串最菜的吗)。我好像经常忘板子(其实写这篇的时候我已经忘了SA怎么写了)。所以写篇博客吧,若以后再忘可以帮助记忆。
SAM和PAM这两个自动机长得比较像,可以一起记。
这里目前只有基础的版本,只能处理单串问题。广义的版本以后某时再补上(发出咕咕的声音)。
SAM 后缀自动机
如何背板:
记住一个循环:for (; p && !go[p][c]; p = par[p]) go[p][c] = np;
记住一个条件:len[q] == len[p] + 1
记得设根为1,不能用空结点做根
伪代码
设0为空结点,1为根
extend(c) {
新建 np 并设置 len (其实是设置除par外的所有属性,因为go为空)
for (!go[p][c]) go[p][c] = np;
if (!p) par =