注意在子串在某个节点的性质,其 father 上也会有相同的性质
 for(int i=0; i<=sz; i++)    tax[i] = 0;
 for(int i=1; i<=sz; i++)    tax[step[i]]++;
 for(int i=1; i<=sz; i++)    tax[i] += tax[i-1];
 for(int i=1; i<=sz; i++)    gid[tax[step[i]]--] = i;struct Sam {
    int node[maxn][27], fa[maxn], step[maxn];
    int sz, last;
    int newnode() {
        mes(node[++sz], 0);
        fa[sz] = step[sz] = 0;
        return sz;
    }
    void init() {
        sz = 0;
        last = newnode();
    }
    void insert(int k) {
        int p = last, np = last = newnode();
        step[np] = step[p]+1;
        for(; p&&!node[p][k]; p=fa[p])
            node[p][k] = np;
        if(p==0) {
            fa[np] = 1;
        } else {
            int q = node[p][k];
            if(step[q] == step[p]+1) {
                fa[np] = q;
            } else {
                int nq = ++sz;
                memcpy(node[nq], node[q], sizeof(node[q]));
                fa[nq] = fa[q];
                step[nq] = step[p]+1;
                fa[np] = fa[q] = nq;
                for(; p&&node[p][k]==q; p=fa[p])
                    node[p][k] = nq;
            }
        }
    }
} sam;原文:https://www.cnblogs.com/Jiaaaaaaaqi/p/10987468.html