后缀自动机模板

const int MAXN = 2000005;

struct SAM {
  int tot, lst, len[MAXN], cnt[MAXN], nxt[MAXN][26], fa[MAXN];
  vector<int> e[MAXN];
  
  SAM() {
    tot = lst = 1;
  }
  
  void add(char c) {
    int u = ++tot, p = lst;
    len[u] = len[lst] + 1, cnt[u] = 1, lst = u;
    for(; p && !nxt[p][c - 'a']; nxt[p][c - 'a'] = u, p = fa[p]) {
    }
    if(!p) {
      fa[u] = 1;
    }else {
      int q = nxt[p][c - 'a'];
      if(len[q] == len[p] + 1) {
        fa[u] = q;
      }else {
        int v = ++tot;
        len[v] = len[p] + 1, fa[v] = fa[q], fa[u] = fa[q] = v;
        for(; p && nxt[p][c - 'a'] == q; nxt[p][c - 'a'] = v, p = fa[p]) {
        }
        for(int i = 0; i < 26; nxt[v][i] = nxt[q][i], ++i) {
        }
      }
    }
  }
  
  void build() {
    for(int i = 2; i <= tot; ++i) {
      e[fa[i]].emplace_back(i);
    }
  }
}sam;
posted @ 2026-01-12 21:31  Yaosicheng124  阅读(2)  评论(0)    收藏  举报