[ABC200F] Minflip Summation

[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\) 的前缀字符串的合法数量。得到如下转移:

\[\begin{aligned} &dp_{i,0,0}=dp_{i-1,0,0}+dp_{i-1,0,1}\\ &dp_{i,0,1}=dp_{i-1,0,0}+dp_{i-1,0,1}+cnt_{i-1}\times [S_{1}\ne 1]\times [S_{i-1}\ne 1]\\ &dp_{i,1,0}=dp_{i-1,1,1}+dp_{i-1,1,0}+cnt_{i-1}\times [S_{1}\ne 0]\times [S_{i-1}\ne 0]\\ &dp_{i,1,1}=dp_{i-1,1,1}+dp_{i-1,1,0}\\ \end{aligned} \]

注意如果 \(dp_{i,j,k}\) 不合法,那么 \(dp_{i,j,k}=0\)

最后考虑 \(K\ne1\) 的情况,考虑使用矩阵乘法优化上面的 \(\text{dp}\),时间复杂度为 \(O(5^3\cdot(n + \log K))\)

最后的最后,当 \(|S|=1\) 时要特判。

posted @ 2023-07-09 08:43  Semorius  阅读(32)  评论(0)    收藏  举报