SAM 构建求问
  • 板块学术版
  • 楼主cowardTester
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/23 20:47
  • 上次更新2024/12/24 12:31:41
查看原帖
SAM 构建求问
711690
cowardTester楼主2024/12/23 20:47

Rt, 本人在阅读 OI-wiki 构建 SAM 代码时不理解(解释看不懂呀qwq),代码如下:

void sam_extend(char c) {
  int cur = sz++;
  st[cur].len = st[last].len + 1;
  int p = last;
  while (p != -1 && !st[p].next.count(c)) {
    st[p].next[c] = cur;
    p = st[p].link;
  }
  if (p == -1) {
    st[cur].link = 0;
  } else {
    int q = st[p].next[c];
    if (st[p].len + 1 == st[q].len) {
      st[cur].link = q;
    } else {
      int clone = sz++;
      st[clone].len = st[p].len + 1;
      st[clone].next = st[q].next;
      st[clone].link = st[q].link;
      while (p != -1 && st[p].next[c] == q) {
        st[p].next[c] = clone;
        p = st[p].link;
      }
      st[q].link = st[cur].link = clone;
    }
  }
  last = cur;
}
  1. clone 具体代表什么?

    • 我理解这里处理的是,将 scs\cdot c 最长的在 ss 中出现的后缀设为 zz,将 zz 所处的等价类分裂成两个,clone 应当是其中一个,但 len[clone]len[clone] 为何是 len[p]+1len[p]+1
  2. 为何将所有 next[c]next[c] 指向 qqnextnext 都转为指向 cloneclone

  • 我理解不是应当讨论长度,长度较大的一部分指向分裂出长度较大的状态吗?

    求问,感激不尽!

2024/12/23 20:47
加载中...