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;
        }
    }
}

原文地址:https://www.cnblogs.com/happyguy/p/14188231.html