[ABC200F] Minflip Summation
题意简述:
给定一个字符串 \(S\) ($ 1\ \le\ |S|\ \le\ 10^5 $), \(S\) 仅包含 \(0\) , \(1\) , \(?\)。将该字符串复制 \(K\) ($ 1\ \le\ |K|\ \le\ 10^9 $) 遍,得到字符串 \(S'\),\(S'\) 中的 \(?\) 可随意替换成 \(0\) 或 \(1\),对于 \(S'\) 可能得到的每一种情况,求解子问题:
给定 \(01\) 串,每次操作可任选一个区间并对其进行 \(01\) 反转(\(0\) 变 \(1\),\(1\) 变 \(0\)),问把该 \(01\) 串所有元素均变为 \(0\) 或 \(1\) 的最小操作次数。
输出子问题答案和。
Hint:
首先考虑 \(K=1\),且字符串中没有 \(?\) 的情况,也就是先考虑子问题。
考虑操作策略,由于最终目标是把所有元素均变为 \(0\) 或 \(1\),所以一次操作应尽量减少 \(01\) 段的数量。如果每次操作的区间包含的并不都是 \(0\) 或 \(1\) 的整段,比如:
01101100
操作区间:\([3, 7]\)
01010010
那么操作完成后 \(01\) 段的数量会变多,所以操作区间覆盖的一定是完整的 \(01\) 段。然后我们发现每次这样的操作最多能减少 \(2\) 个 \(01\) 段,设初始共有 \(\text{x}\) 个 \(01\) 段,那么最少操作次数为 \(\left \lfloor \frac{x}{2} \right \rfloor\)。
Solution:
然后考虑如果 \(K=1\),且字符串中有 \(?\) 的情况。
显然这个问题可以通过 \(\text{dp}\) 求解。设 \(dp_{i,0/1,0/1}\) 表示考虑到第 \(i\) 个位置,第 \(1\) 个位置为 \(0/1\),第 \(i\) 个位置为 \(0/1\) 的总答案。设 \(cnt_i\) 表示确定第 \(1\) 个和第 \(i\) 个位置后,下标小于等于 \(i\) 的前缀字符串的合法数量。得到如下转移:
注意如果 \(dp_{i,j,k}\) 不合法,那么 \(dp_{i,j,k}=0\)。
最后考虑 \(K\ne1\) 的情况,考虑使用矩阵乘法优化上面的 \(\text{dp}\),时间复杂度为 \(O(5^3\cdot(n + \log K))\)。
最后的最后,当 \(|S|=1\) 时要特判。

浙公网安备 33010602011771号