uoj1016 另解

题中给的是 AC 自动机的前半部分,那么建 fail 树,所有合法的 \(x\) 就是 \(u\) 在 fail 树上的祖先节点。

考虑 \(s_{a_i}=c_i\) 的限制在这些串的体现:\(s_x\)\(a_i\) 位置相当于 \(s_u\)\(|s_u|-|s_x|+a_i\) 位置。令 \(d_u=|s_u|-|s_{fail_u}|\),等于在 \(a_i\) 位置放一颗棋子,在串 \(s_u\) 上挪这个棋子,每次向后移动 \(d_x\) 格后令 \(x=fail_x\)。先不考虑 \(a_i\),将这个棋子涉及的位置写成一个 \(01\)\(S\),那么 \(a_i\) 等于对 \(S\) 整体移动 \(a_i\) 格得到 \(S'\)。用 bitset 处理出 \(s_u\)\(=c_u\) 的位置,将 \(S'\) 与其取交即可,对多个限制就取多次交。

\(n,q\) 同阶,时间复杂度 \(\mathcal O(\frac{n^2}{\omega})\)。对于空间问题,可以分块并且逐块统计落在 \([L,R]\) 位置中的贡献。

posted on 2025-12-24 08:44  nullptr_qwq  阅读(13)  评论(0)    收藏  举报