后缀自动机SAM学习

走远了吗. 提交于 2020-04-04 19:01:21

最近学完了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;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!