先讓 SAM 的 extend 函式返回 cur
簡單來說,就是先建 Trie 再 BFS 地插入 SAM,其中 last 為 trie 上 u 的父親。
以上是離線構建,線上如何構建?
每次先把 last 設為 0,然後在普通 SAM 上加 3 個特判:
- 最開始:
if (nxt[last][c] && len[nxt[last][c]] == len[last] + 1) return nxt[last][c];
- 在判完
len[p] + 1 == len[q]
後,若不滿足:
if (p == last) ok = 1, cur = N - 1, --sz;
就是讓 cur 等於一個不會用到的點
3. 函式返回處:
return ok ? clone : p;
正確性證明:先咕著。