SAM最近完成した学校が、実用的な実装、事前に既存のコード、書き込みノート(怠惰)明日されていません。
から学びます
struct SAM
{
int maxlen[N],trans[N][26],link[N],tot,last;
inline void extend(int id)
{
int cur=++tot,p;
maxlen[cur]=maxlen[last]+1;
for(p=last;p&&!trans[p][id];p=link[p]) trans[p][id]=cur;
if(!p) link[cur]=1;
else
{
int x=trans[p][id];
if(maxlen[x]==maxlen[p]+1) link[cur]=x;
else
{
int y=++tot;
maxlen[y]=maxlen[p]+1;
for(int i=0;i<26;i++) trans[y][i]=trans[x][i];
link[y]=link[x];
for(;p&&trans[p][id]==x;p=link[p]) trans[p][id]=y;
link[cur]=link[x]=y;
}
}
last=cur;
}
}sam;