sam板子
代码是最好的教程。
广义sam
int tt=1;
inline void extend(int c){
int p=lst,q,np,nq;
if(ts[p][c]){
q=ts[p][c];
if(len[q]==len[p]+1)lst=q;
else{
lst=nq=++tt;
memcpy(ts[nq],ts[q],sizeof(ts[q])),len[nq]=len[p]+1,fa[nq]=fa[q];
fa[q]=nq;
for(;ts[p][c]==q;p=fa[p])ts[p][c]=nq;
}
}else{
lst=np=++tt,len[np]=len[p]+1;
for(;p&&!ts[p][c];p=fa[p])ts[p][c]=np;
if(!p)fa[np]=1;
else{
q=ts[p][c];
if(len[q]==len[p]+1)fa[np]=q;
else{
nq=++tt;
memcpy(ts[nq],ts[q],sizeof(ts[q])),len[nq]=len[p]+1,fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for(;ts[p][c]==q;p=fa[p])ts[p][c]=nq;
}
}
}
}
普通sam
//主函数记得写 lst=tt=1;
inline void extend(int c){
int p=lst,np=++tt,q,nq;
lst=np,len[np]=len[p]+1;
for(;p&&!ts[p][c];p=fa[p])ts[p][c]=np;
if(!p)fa[np]=1;
else{
q=ts[p][c];
if(len[q]==len[p]+1)fa[np]=q;
else{
nq=++tt;
len[nq]=len[p]+1,fa[nq]=fa[q],memcpy(ts[nq],ts[q],sizeof(ts[q]));
fa[np]=fa[q]=nq;
for(;ts[p][c]==q;p=fa[p])ts[p][c]=nq;
}
}
}