后缀自动机 个人学习笔记
仅简单记录一些自己看得懂的东西
后缀自动机大概就长这样(图源hihocoder)
只看蓝色边就类似一棵字典树
对于一个点,从起点能走到它的路径都是它的后缀,蓝色边就是next指针
绿色边是fail指针
一个结点表示的所有后缀在同一个endpos类,并且长度是连续的
↑ 所以子串的个数就是每个结点表示子串的个数和,也就是sum(maxlen-minlen+1)
endpos(st)= endpos(x)+ endpos(y)+ 【st包含S的前缀】
关于遍历SAM的Suffix Links,hihocoder的做法是拓扑排序,某谷上一位dalao的做法是fa[i]->i建树,其实那就是一棵树而且好像叶结点刚好是前缀点???
关于SAM的fail指针指的是什么:指向parent tree的父结点,endpos(this)完全包含endpos(fa)
经常看到有人代码里应该拓扑排序的地方看到有类似SA里面基数排序的东西。。。
按照len桶排序之后也就是Parent树的BFS序/自动机的拓扑序(转自某谷一聚聚)
容易感性的证明一下
板子:
1 for(int i=1;i<=tot;i++) t[len[i]]++; 2 for(int i=1;i<=tot;i++) t[i]+=t[i-1]; 3 for(int i=1;i<=tot;i++) A[t[len[i]]--]=i;
关于广义后缀自动机:
?一键咕咕?