变量
- int tot:节点个数。
- int lst:原串最后一个字符所在的节点。
- Node a[p]:节点 p 的信息。
- int a[p].len:节点 p 代表的子串集合中最长的长度。
- int a[p].fa:节点 p 在 parent 树上的父亲。
- int a[p].ch[c]:节点 p 在后缀自动机上接上字符 c 后的节点。
函数
- SAM():初始化。
- void insert(int c):插入字符 c,注意是减掉 standard 后的。
代码
struct SAM{
int tot,lst;
struct Node{
int len,fa,ch[26];
Node(){memset(ch,0,sizeof(ch));len=fa=0;}
}a[N<<1];
SAM(){tot=lst=1;}
void insert(int c){
int p=lst,np=lst=++tot,q,nq;
a[np].len=a[p].len+1;
for(;p&&!a[p].ch[c];p=a[p].fa)a[p].ch[c]=np;
if(!p)a[np].fa=1;
else{
q=a[p].ch[c];
if(a[q].len==a[p].len+1)a[np].fa=q;
else{
nq=++tot;a[nq]=a[q];
a[nq].len=a[p].len+1;a[q].fa=a[np].fa=nq;
for(;p&&a[p].ch[c]==q;p=a[p].fa)a[p].ch[c]=nq;
}
}
}
}sam;