后缀自动机 SAM
不太懂,并不想说什么..
参考资料:
hihocoder后缀自动机基本概念
陈立杰的WC课件
fhq的博客
俄文论文翻译
附个\(insert\)图(来自:https://www.cnblogs.com/Yuzao/p/7267490.html)
void insert(int c){
int p=last,np=++cnt;
last=np;
len[np]=len[p]+1;
for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
if(!p) fa[np]=1;
else{
int q=ch[p][c];
if(len[q]==len[p]+1) fa[np]=q;
else{
int nq=++cnt;
len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
size[np]=1;
}
void get_size(){
for(int i=1;i<=cnt;i++) c[len[i]]++;
for(int i=1;i<=cnt;i++) c[i]+=c[i-1];
for(int i=cnt;i;i--) a[c[len[i]]--]=i;
for(int i=cnt;i;i--){
int p=a[i];
size[fa[p]]+=size[p];
}
}