2018-team4-modules-后缀自动机

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
struct Node{
    int len,fa;
    map<int,int>nx;
}T[maxn<<2];
int last,nodecnt;
inline void init(){
    last = nodecnt = 0;
    T[0].len = 0;T[0].fa = -1;
}
void insert(int c){
    int cur = ++nodecnt,p;
    T[cur].len = T[last].len + 1;
    for(p=last;p!=-1 && !T[p].nx.count(c);p = T[p].fa)
        T[p].nx[c] = cur;
    if(p == -1) T[cur].fa = 0;
    else{
        int q = T[p].nx[c];
        if(T[q].len == T[p].len + 1) T[cur].fa = q;
        else{
            int co = ++ nodecnt;
            T[co] = T[q];T[co].len = T[p].len+1;
            for(;p!=-1 && T[p].nx[c] == q;p = T[p].fa)
                T[p].nx[c] = co;
            T[q].fa = T[cur].fa = co;
        }
    }last = cur;
}
}}}
struct Node{
    int len,fa;
    map<int,int>nx;
}T[maxn<<2];
int last,nodecnt;
inline void init(){
    last = nodecnt = 0;
    T[0].len = 0;T[0].fa = -1;
}
void insert(int c){
    int cur = ++nodecnt,p;
    T[cur].len = T[last].len + 1;
    for(p=last;p!=-1 && !T[p].nx.count(c);p = T[p].fa)
        T[p].nx[c] = cur;
    if(p == -1) T[cur].fa = 0;
    else{
        int q = T[p].nx[c];
        if(T[q].len == T[p].len + 1) T[cur].fa = q;
        else{
            int co = ++ nodecnt;
            T[co] = T[q];T[co].len = T[p].len+1;
            for(;p!=-1 && T[p].nx[c] == q;p = T[p].fa)
                T[p].nx[c] = co;
            T[q].fa = T[cur].fa = co;
        }
    }last = cur;
}