【ABC200F】Minflip Summation

时间:2021-08-08
本文章向大家介绍【ABC200F】Minflip Summation,主要包括【ABC200F】Minflip Summation使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

\(\texttt{ABC200 }\text{Minflip Summation}\)

给定由 10? 构成的字符串 \(S'\) 和正整数 \(k\) ,从而得到 \(k\)\(S'\) 顺序拼接而成的字符串 \(S\)? 可以任意地填写 10 ,设 \(S'\) 中的 ? 数量为 \(q\) ,这样得到了 \(2^{qk}\) 个新字符串。考虑用最少的步数将每一个新字符串变换成全由 1 构成的字符串或者由 0 构成的字符串,变换规则为区间取反。输出这些最少步数的总和。答案模 \(1e9+7\) 。数据范围:\(1\le|S'|\le 1e5,1\le k\le 1e9\)

第一个小 trick 是考虑异或差分,按位异或的逆运算也是按位异或。这样,区间修改就转化为单点修改。目标是使差分数组均变为 0 ,单点修改可以一次只取反一个,也可以一次取反两个,所以只需要考察有几个 01 段和 10 段。设有 \(k\) 个这样的段,则至少需要修改 \(\lfloor\frac{k+1}{2}\rfloor\) 次修改,且可以做到。具体地,两两配对修改后,若还有剩余一个点,再修一次。据此,先考虑不存在 ? 的情况 ,从左往右扫来转移,修改次数增加当且仅当段数从偶数变化到奇数,可以得到:

  • 若当前位为 0 ,那么修改次数增加的充要条件是第一位为 1 且前一位为 1
  • 若当前位为 1 ,那么修改次数增加的充要条件是第一位为 0 且前一位为 0

所以,次数的增加与否,仅和第一位和前一位有关。

在加入 ? 后,只需要把 \(\text{mark}_i(\text{第一位},\text{前一位})\) 的推广到 \(\text{cnt}_i(\text{第一位},\text{前一位})\) ,也就是说,某种状态可能不只出现一次,但步数的增加方式是类似的。

设计状态:

\[\begin{pmatrix} \text{cnt}_i(0,0) \\ \text{cnt}_i(0,1) \\ \text{cnt}_i(1,0) \\ \text{cnt}_i(1,1) \\ \sum_{j=1}^i\text{step}_j \end{pmatrix} \]

简记为 \(\text{A}_i\) 。考虑从第 \(i-1\) 到第 \(i\) 位的转移矩阵 \(M_i\)

  • 若第 \(i\) 位是 0 ,则转移矩阵 \(\text{Zero}\)
\[\begin{pmatrix} 1 &1 &0 &0 &0\\ 0 &0 &0 &0 &0\\ 0 &0 &1 &1 &0\\ 0 &0 &0 &0 &0\\ 0 &0 &0 &1 &1 \end{pmatrix} \]
  • 若第 \(i\) 位是 1 ,则转移矩阵 \(\text{One}\)
\[\begin{pmatrix} 0 &0 &0 &0 &0\\ 1 &1 &0 &0 &0\\ 0 &0 &0 &0 &0\\ 0 &0 &1 &1 &0\\ 1 &0 &0 &0 &1 \end{pmatrix} \]
  • 若第 \(i\) 位是 ? ,则转移矩阵 \(\text{Que}=\text{Zero}+\text{One}\)

\(k\)\(S'\) 拼接,只需求出 \(\prod_{i=1}^{|S'|}M_i\) 后套个快速幂即可。

总复杂度 \(O(|S'|+\log(k))\)​ 。

\(\square\)

原文地址:https://www.cnblogs.com/gsjz/p/14974168.html