最近学完了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;
来源:https://www.cnblogs.com/Suiyue-Li/p/12633177.html