题解:CF1466 G.Song of the Sirens
设 \(F(m, s_i)\) 表示字符串 \(m\) 在 \(s_i\) 中出现的个数,再设 \(G(m, s_i)\) 表示 \(s_i\) 中因新增加的字符 \(t_i\) 而新出现的 \(m\) 串个数。
那么有简单的转移:
为了把它转换成通项公式,设 \(s_p\) 为 \(m\) 第一次出现的字符串,则有:
对于询问操作,发现 \(s_k\) 比 \(w\) 通常大的多,考虑统计新串对 \(w\) 的贡献。(以下的暴力统计均可看成 hash 或 KMP 匹配) 。
\(F(w,s_p)\) 的统计方法比较直接,直接小串上暴力匹配即可,考虑对于 \(\sum_{j = p + 1}^k 2^{k - j} \times G(w, s_j)\) 的统计。
当 \(s_i\) 较小时,不需要统计 \(G\) ,因为贡献已经统计在 \(F\) 中了。
当 \(s_i\) 较大时 \((|w| < |s_i|)\) ,发现 \(G(w, s_i)\) 的值只包含字符串 \(\text{suf}_{i - 1}\ t_i\ \text{pre}_{i - 1}\) 对答案的贡献,其中 \(\text{suf}_{i}\) 表示 \(s_{i}\) 后 \(|w|\) 个字符, \(\text{pre}_i\) 表示 \(s_{i}\) 前 \(|w|\) 个字符。
考虑如何统计答案,发现字符集 \(|\Sigma|\) 只有 26 ,也说明了在该种情况中对于 \(G(m, s_i)\) 的值也只有 26 种情况。
将式子移项, \(\sum_{j = p + 1}^k 2^{k - j} \times G(w, s_j) \rightarrow 2^k \times \sum_{j = p + 1}^k 2^{- j} \times G(w, s_j)\) 。
解决方案已经显而易见了,分别统计 26 种情况的同时将每种 \(G(w, \text{suf}_{p - 1}\ t_i\ \text{pre}_{p - 1})\) 的值乘上 \(\sum_{i = p}^k [c = t_i]\times 2^{-i}\) ,可以前缀和快速处理。
Code:link 。