后缀自动机(SAM)学习笔记
后缀自动机是一种处理字符串的强大工具。
后缀自动机是一个具有 \(O(N)\) 个节点的 DAG,图上每条路径都可以表示原串的一个子串。
总之 SAM 有很多非常牛的性质。
我的板子
int sz=0,lnk[N*2],len[N*2],to[N*2][26],las=0;
inline void ext_sam(int c)
{
int now=++sz;len[now]=len[las]+1;
while(las>=0&&!to[las][c])to[las][c]=now,las=lnk[las];
if(las<0)lnk[now]=0;
else if(len[las]+1==len[to[las][c]])lnk[now]=to[las][c];
else
{
int clo=++sz,q=to[las][c];
lnk[clo]=lnk[q];len[clo]=len[las]+1;
memcpy(to[clo],to[q],26*sizeof(int));
while(las>=0&&to[las][c]==q)to[las][c]=clo,las=lnk[las];
lnk[now]=lnk[q]=clo;
}
las=now;
}