[ABC200F]Minflip Summation
我们有一个字符串 \(S\),由 0,1 和 ? 组成,\(T\) 为 \(S\) 重复 \(K\) 次的结果。
如果我们把 \(T\) 中每个 ? 都替换成 0 或 1,我们就能够得到 \(2^{Kq}\) 种不同的字符串,其中 \(q\) 是 \(S\) 中 ? 的数量。对于每个由如下规则生成的字符串,解决如下问题,把答案求和并模 \(10^9+7\):
设 \(T'\) 为把 \(T\) 中所有
?替换为0或1得到的字符串。我们会重复执行如下操作,直到 \(T\) 中所有元素均相同。最少需要多少次操作?
- 选择两个整数 \(l,r\) 满足 \(1 \le l \le r \le |T'|\),把 \(S\) 的第 \(l\) 个到第 \(r\) 个字符取反。取反的意思是,
0变为1,反之亦然。
\(1 \le |S| \le 10^5\),\(1 \le K \le 10^9\)。
看到一个非常巧妙的做法。
我们看到区间取反,直接考虑异或差分,然后操作就变成了每次将两个 1 变成 0。
而当整个序列都变成全 0 后,我们的原序列要么是全 0,要么是全 1,都是符合要求的。
而且新的序列里 1 的数量一定是偶数,所以答案就是 \(\frac k2\),\(k\) 表示 1 的个数。
那么,我们的目标就变成了对差分后的新序列 \(T'\) 中的 1 计数,相当于相邻两项不相等的对数。
根据期望的线性性,我们可以直接拆开来,单独考虑相邻两个字符的贡献。
于是我们分类讨论:
- 相邻两个字符都是固定的,那么假如原来不相同,对答案有 \(\frac12\) 的贡献,否则有 \(0\) 的贡献。
- 相邻两个中有一个
?,那么这时候他有 \(\frac12\) 的概率和另外一个相同,所以贡献是 \(\frac14\)。 - 相邻两个都是
?,这时不难发现和第二种情况是一样的。
于是把 \(S\) 扫一遍,对首尾情况再特判一下,就做完啦
……吗?其实并没有,我们发现当 \(S=\) ? 的时候,我们计算出来的答案是 \(\frac14\),但是实际上应该是 \(\frac 12\),为什么呢?
是因为这时候首尾的两个 ? 其实本质上是同一个字符,但是我们将它当作了两个独立的随机变量,所以需要特判。其他的情况是不会出现问题的。
于是就真的做完啦。啦啦啦。
本文来自博客园,作者:CuteNess,转载请注明原文链接:https://www.cnblogs.com/CuteNess/p/18858892

浙公网安备 33010602011771号