【笔记】Tricks - 后缀自动机 SAM
-
因为由 endpos 带来的很多美妙的性质,可以考虑枚举 sam 上的状态。
-
匹配类的问题,可以考虑像 acam 一样跳 link(fail)链。
-
对于一个串,可以找到她所有前缀的在 sam 上面的的最大的 len。【[BJOI2020] 封印】【CF666E Forensic Examination】
具体做法是动态维护当前前缀在 sam 上面的点。(f 是最长的 lencur = sam.rt; for (int i = 1; i <= n; i++) { char ch = s[i]-'a'; if (sam[cur].nxt[ch]) f[i] = f[i-1]+1, cur = sam[cur].nxt[ch]; //!上面这个 if 也不能省,因为如果直接用 cur 的 len 更新的话,不能确保是合法的。 else { while (cur && !sam[cur].nxt[ch]) cur = sam[cur].link; if (!cur) cur = sam.rt; else f[i] = sam[cur].len+1, cur = sam[cur].nxt[ch]; // else cur = sam[cur].nxt[ch], f[i] = sam[cur].len; //!这样是不行的,因为我们只保证的从 rt 到 cur 的 len 是合法的,但不一定走了转移边之后也合法。 } }