CFCF2183I2.Pairs Flipping (Hard Version)

NOI/NOI+/CTSC

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是该问题的难度较高版本。不同之处在于,在本版本中,对于最终字符串中剩余 11 的数量的限制更加严格。只有在解决了该问题的所有版本后,才可以进行 Hack。

给定一个仅包含 0011 的二进制字符串 s1s2sns_1s_2\ldots s_n。你可以进行 $ \lfloor\frac{n}{2}\rfloor $ 次操作。在第 xx 次操作时,你可以执行以下操作:

  • 选择一个整数 ll,其中 0lnx0 \leq l \leq n-x。如果 l=0l=0,则什么也不做。否则,将字符 sls_lsl+xs_{l+x} 都进行反转。也就是说,对于每个字符,如果原本是 00,则变为 11,如果原本是 11,则变为 00

你的任务是找到一系列操作,使得操作结束后,二进制字符串中剩余的 11 的个数不超过 77。可以证明,在本题的约束条件下,总能做到这一点。

输入格式

每组测试数据包含多组测试用例。第一行包含一个整数 tt1t1051 \le t \le 10^5),表示测试用例的数量。

每个测试用例的第一行包含一个整数 nn3n21063 \leq n \leq 2 \cdot 10^6)。

第二行包含一个二进制字符串 s1s2sns_1s_2\ldots s_nsi{0,1}s_i \in \{0,1\})。

保证所有测试用例中 nn 的总和不超过 21062 \cdot 10^6

输出格式

对于每个测试用例,输出 $ \lfloor\frac{n}{2}\rfloor $ 个数,分别为第 11 次操作到第 $\lfloor\frac{n}{2}\rfloor $ 次操作选择的 ll,满足 0lxnx0 \leq l_x \leq n - x。你需要保证在所有操作结束后,字符串中剩余的 11 的个数不超过 77

如果有多种方案,输出任意一种即可。

输入输出样例

  • 输入#1

    6
    3
    000
    4
    1101
    5
    11101
    9
    111111111
    10
    1111111011
    15
    110011101010100

    输出#1

    0 
    1 1
    1 3 
    6 2 0 2 
    1 0 0 0 0
    13 6 8 5 2 8 1

说明/提示

以第四组测试数据为例:

  • 初始字符串 s=111111111s = 111111111。由于 n=9n=9,因此可以进行 $ \lfloor\frac{9}{2}\rfloor = 4 $ 次操作。
  • 第一次操作选择 l=6l=6,即反转第 66 和第 6+1=76+1=7 个字符。此时,s=111110011s = 111110011
  • 第二次操作选择 l=2l=2,即反转第 22 和第 2+2=42+2=4 个字符。此时,s=101010011s = 101010011
  • 第三次操作选择 l=0l=0,即不做任何操作。
  • 第四次操作选择 l=2l=2,即反转第 22 和第 2+4=62+4=6 个字符。此时,s=111011011s=111011011
  • 最终字符串中有 7711,并且 777 \leq 7,因此该方案正确。
首页