广义 SAM

先让 SAM 的 extend 函数返回 cur

简单来说,就是先建 Trie 再 BFS 地插入 SAM,其中 last 为 trie 上 u 的父亲。

以上是离线构建,在线如何构建?

每次先把 last 设为 0,然后在普通 SAM 上加 3 个特判:

  1. 最开始:
if (nxt[last][c] && len[nxt[last][c]] == len[last] + 1) return nxt[last][c];
  1. 在判完 len[p] + 1 == len[q] 后,若不满足:
if (p == last) ok = 1, cur = N - 1, --sz;

就是让 cur 等于一个不会用到的点
3. 函数返回处:

return ok ? clone : p;

正确性证明:先咕着。

posted @ 2024-09-09 07:39  Laijinyi  阅读(1)  评论(0编辑  收藏  举报