后缀树(suffix tree)

const int inf = 0x3f3f3f3f;
const int maxn = 100010;
struct Suffix_Tree{
    int start[maxn << 1], len[maxn << 1], next[maxn << 1][27], link[maxn << 1];
    int tot, now, rem, last, pos, root;
    int text[maxn << 1];
    int new_node(int st, int l = inf){
        start[tot] = st;
        len[tot] = l;
        link[tot] = 0;
        memset(next[tot], 0, sizeof(next[tot]));
        return tot++;
    }
    void init(){
        tot = now = rem = last = pos = 0;
        root = new_node(0);
    }
    void extend(int c){
        text[++pos] = c;
        ++rem;
        last = 0;
        while(rem){
            while (rem > len[next[now][text[pos - rem + 1]]])
                rem -= len[now = next[now][text[pos - rem + 1]]];
            if(next[now][text[pos - rem + 1]] == 0){
                int leaf = new_node(pos);
                next[now][text[pos - rem + 1]] = leaf;
                link[last] = now;
                last = now;
            }else{
                int v = next[now][text[pos - rem + 1]];
                if(text[start[v] + rem - 1] == c){
                    link[last] = now;
                    last = now;
                    break;
                }
                int split = new_node(start[v], rem - 1);
                next[now][text[pos - rem + 1]] = split;
                next[split][c] = new_node(pos);
                next[split][text[start[v] + rem - 1]] = v;
                start[v] += rem - 1;
                len[v] -= rem - 1;
                link[last] = split;
                last = split;
            }
            if(!now) --rem;
            else now = link[now];
        }
    }
};

posted @ 2021-09-30 13:23  Zeronera  阅读(56)  评论(0)    收藏  举报