后缀自动机 个人学习笔记

仅简单记录一些自己看得懂的东西

 

 

 

后缀自动机大概就长这样(图源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;
View Code

 

 

 

关于广义后缀自动机:

?一键咕咕?

 

posted @ 2019-09-23 21:05  QAQorz  阅读(169)  评论(0编辑  收藏  举报