QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: nullptr_qwq

Posted at:

Last updated:

Back to Problem

New Editorial for Problem #20741

考虑 $x+c$ 在 $b$ 中的出现位置形如 $b[1:p-1]+b[p:k]$,那么对 $b$ 建 SA 后 $c_{1\sim k}$ 会限定一个合法的 $p$ 在后缀数组上的一个区间 $[l,r]$。对于每个 $p$ 求出最大的 $f_p$ 使得 $b[p-f_p+1:p]$ 为 $a$ 的子串,可以对 $a$ 建 SAM 后走一遍求 $f$。

现在问题形如将 $rk_i\in[l,r]$ 的点激活,求所有 $i$ 结尾长度 $\leq f_i$ 的后缀的并集大小。对于反串建 SA 后就是每个位置有权值,激活权值 $[l,r]$ 中的点后点减边容斥减掉相邻的 $\min(f_i,f_j,h_{i\sim j})$。可以回滚莫队做到 $O(n\sqrt q)$。

其实可以直接在 $a$ 的 SAM 上做,变成一个点的合法字符串是这个后缀走到的状态的后缀树上到根链并,每个节点有 $len_u-len_{fa_u}$ 的贡献。求激活 $[l,r]$ 内节点的链并大小,比较经典,直接扫描线+树剖颜色段均摊即可维护,时间复杂度 $O(n\log^2n+q\log n)$。

Comments

avatar
gty314159
你也可以写启发式合并维护 $\sum len_u - \sum len_{lca(u,v)}$