题解:CF1466 G.Song of the Sirens

题面

\(F(m, s_i)\) 表示字符串 \(m\)\(s_i\) 中出现的个数,再设 \(G(m, s_i)\) 表示 \(s_i\) 中因新增加的字符 \(t_i\) 而新出现的 \(m\) 串个数。

那么有简单的转移:

\[F(m, s_i) = 2\times F(m, s_{i - 1}) + G(m, s_i) \]

为了把它转换成通项公式,设 \(s_p\)\(m\) 第一次出现的字符串,则有:

\[F(m, s_i) = 2^{i - p}\times F(m, s_p) + \sum_{j = p + 1}^i 2^{i - j} \times G(m, s_j) \]

对于询问操作,发现 \(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

posted @ 2021-03-10 08:46  AxDea  阅读(63)  评论(0编辑  收藏  举报