[ABC200F]Minflip Summation

我们有一个字符串 \(S\),由 01? 组成,\(T\)\(S\) 重复 \(K\) 次的结果。

如果我们把 \(T\) 中每个 ? 都替换成 01,我们就能够得到 \(2^{Kq}\) 种不同的字符串,其中 \(q\)\(S\)? 的数量。对于每个由如下规则生成的字符串,解决如下问题,把答案求和并模 \(10^9+7\)

\(T'\) 为把 \(T\) 中所有 ? 替换为 01 得到的字符串。我们会重复执行如下操作,直到 \(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 计数,相当于相邻两项不相等的对数。

根据期望的线性性,我们可以直接拆开来,单独考虑相邻两个字符的贡献。

于是我们分类讨论:

  1. 相邻两个字符都是固定的,那么假如原来不相同,对答案有 \(\frac12\) 的贡献,否则有 \(0\) 的贡献。
  2. 相邻两个中有一个 ?,那么这时候他有 \(\frac12\) 的概率和另外一个相同,所以贡献是 \(\frac14\)
  3. 相邻两个都是 ?,这时不难发现和第二种情况是一样的。

于是把 \(S\) 扫一遍,对首尾情况再特判一下,就做完啦

……吗?其实并没有,我们发现当 \(S=\) ? 的时候,我们计算出来的答案是 \(\frac14\),但是实际上应该是 \(\frac 12\),为什么呢?

是因为这时候首尾的两个 ? 其实本质上是同一个字符,但是我们将它当作了两个独立的随机变量,所以需要特判。其他的情况是不会出现问题的。

于是就真的做完啦。啦啦啦。

posted @ 2025-05-04 00:45  CuteNess  阅读(8)  评论(0)    收藏  举报