CF1659B Bit Flipping
题目描述
给定一个长度为 $n$ 的二进制字符串。你有恰好 $k$ 次操作机会。每次操作,你必须选择一个比特位。除了被选择的那个比特位外,其余所有比特位的状态都会翻转($0$ 变为 $1$,$1$ 变为 $0$)。你需要输出在用完所有 $k$ 次操作后,能够得到的字典序最大的字符串。同时,输出每个位被选择的次数。如果有多种方案,可以输出任意一种。
对于长度相同的二进制字符串 $a$ 和 $b$,当且仅当在第一个不同的位置,$a$ 的该位为 $1$ 且 $b$ 的该位为 $0$ 时,$a$ 的字典序大于 $b$。
输入格式
第一行包含一个整数 $t$($1 \le t \le 1000$),表示测试用例的数量。
每个测试用例包含两行。第一行包含两个整数 $n$ 和 $k$($1 \leq n \leq 2 \cdot 10^5$;$0 \leq k \leq 10^9$)。
第二行包含一个长度为 $n$ 的二进制字符串,每个字符为 $0$ 或 $1$。
所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。
输出格式
对于每个测试用例,输出两行。
第一行输出你能得到的字典序最大的字符串。
第二行输出 $n$ 个整数 $f_1, f_2, \ldots, f_n$,其中 $f_i$ 表示第 $i$ 位被选择的次数。所有整数之和必须等于 $k$。
说明/提示
以下是第一个测试用例的解释。每一步展示了在一次操作后字符串的变化。
- 选择第 $1$ 位:$\color{red}{\underline{1}00001} \rightarrow \color{red}{\underline{1}}\color{blue}{11110}$。
- 选择第 $4$ 位:$\color{red}{111\underline{1}10} \rightarrow \color{blue}{000}\color{red}{\underline{1}}\color{blue}{01}$。
- 选择第 $4$ 位:$\color{red}{000\underline{1}01} \rightarrow \color{blue}{111}\color{red}{\underline{1}}\color{blue}{10}$。
最终字符串为 $111110$,这是可以得到的字典序最大的字符串。
由 ChatGPT 4.1 翻译