#CF2146C. 错误二分查找

错误二分查找

C. 错误二分查找

每次测试时间限制:22
每次测试内存限制:256256 兆字节

题目描述

给定一个整数 nn 和一个长度为 nn 的二进制字符串 ss

对于一个长度为 nn 的排列 pp 和一个整数 xx,我们定义 find(x)\text{find}(x) 的伪代码如下:

function find(int x):
    l := 1
    r := n
    while l <= r:
        let m be a random integer between l and r (inclusive)
        if p[m] == x:
            return m
        if p[m] > x:
            r := m - 1
        else:
            l := m + 1
    return undefined     // 未找到

我们称整数 xx1xn1 \le x \le n)是稳定的,当且仅当无论 find(x)\text{find}(x) 过程中如何随机选择 mm,它总是返回一个确定的值(不是未定义),并且 p[find(x)]=xp[\text{find}(x)] = x 始终成立。

你必须构造一个长度为 nn 的排列 pp,使得:

  • 对于每个 1in1 \le i \le n,整数 ii 是稳定的当且仅当 si=1s_i = 1

或者判断这样的排列不存在。

注意:

  • 二进制字符串是指每个字符为 0011 的字符串。
  • 长度为 nn 的排列是由 nn 个不同的整数 11nn 以任意顺序组成的数组。例如,[2,3,1,5,4][2,3,1,5,4] 是一个排列,但 [1,2,2][1,2,2] 不是(22 出现了两次),[1,3,4][1,3,4] 也不是(n=3n=3 但数组中有 44)。

输入

每个测试包含多个测试用例。第一行包含一个整数 tt1t1041 \le t \le 10^4),表示测试用例的数量。接下来是每个测试用例的描述。

每个测试用例的第一行包含一个整数 nn2n21052 \le n \le 2 \cdot 10^5),表示排列的长度。
第二行包含一个长度为 nn 的二进制字符串 sssi{0,1}s_i \in \{0,1\})。

保证所有测试用例的 nn 之和不超过 21052 \cdot 10^5

输出

对于每个测试用例:

  • 如果不存在这样的排列,则输出一行 "NO"
  • 否则,第一行输出 "YES",第二行输出 nn 个不同的整数 p1,p2,,pnp_1, p_2, \dots, p_n1pin1 \le p_i \le n),表示你构造的排列。

你可以以任意大小写输出答案(例如,"yEs""yes""Yes""YES" 均视为肯定答案)。

如果有多个答案,你可以输出任意一个。

示例

输入:

6
3
111
5
00000
5
10100
7
0010000
11
00001001100
12
011100010000

输出:

YES
1 2 3 
YES
2 4 3 5 1
NO
YES
2 1 3 5 7 6 4
YES
2 1 4 3 5 7 6 8 9 11 10
NO

注释

第一个测试用例:我们构造了 p=[1,2,3]p = [1,2,3]。以 find(2)\text{find}(2) 为例:

  • 初始 l=1l = 1r=3r = 3
  • 随机选择 mm[1,3][1,3] 之间:
    • m=1m=1p1=1<2p_1 = 1 < 2,所以 l=m+1=2l = m+1 = 2,此时 l=2,r=3l=2,r=3
      • 再随机选 mm
        • m=2m=2p2=2p_2=2,返回 22
        • m=3m=3p3=3>2p_3=3>2,则 r=m1=2r=m-1=2,此时 l=2,r=2l=2,r=2,只能选 m=2m=2p2=2p_2=2,返回 22
    • m=2m=2p2=2p_2=2,直接返回 22
    • m=3m=3p3=3>2p_3=3>2,则 r=2r=2,此时 l=1,r=2l=1,r=2
      • 再选 mm
        • m=1m=1p1=1<2p_1=1<2l=2l=2,此时 l=2,r=2l=2,r=2,只能选 m=2m=2,返回 22
        • m=2m=2p2=2p_2=2,返回 22
  • 总之,无论随机选择如何,find(2)\text{find}(2) 总是返回 22,因此 22 稳定。

同理可证 1133 也稳定。因此 p=[1,2,3]p=[1,2,3] 是一个合法答案。

第二个测试用例:构造 p=[2,4,3,5,1]p = [2,4,3,5,1]。以 find(3)\text{find}(3) 为例:

  • 初始 l=1,r=5l=1,r=5
  • 若选 m=2m=2p2=4>3p_2=4>3,则 r=m1=1r=m-1=1,此时 l=1,r=1l=1,r=1
    • 只能选 m=1m=1p1=2<3p_1=2<3,则 l=m+1=2l=m+1=2,此时 l=2>r=1l=2>r=1,退出循环,返回未定义。
  • 因此 find(3)\text{find}(3) 可能返回未定义,故 33 不稳定。

同理可证 1,2,4,51,2,4,5 也不稳定。所以 p=[2,4,3,5,1]p=[2,4,3,5,1] 是合法答案。其他如 [5,4,3,2,1][5,4,3,2,1][3,5,1,4,2][3,5,1,4,2] 也是合法答案。

第三个测试用例:可以证明不存在这样的排列。