CF1839C Insert Zero and Invert Prefix

题目描述

你有一个长度为 $n$ 的序列 $a_1, a_2, \ldots, a_n$,其中每个元素都是 $0$ 或 $1$,还有一个初始为空的序列 $b$。 你将进行 $n$ 次操作,每次操作会使 $b$ 的长度增加 $1$。 - 在第 $i$ 次操作时,你选择一个整数 $p$,满足 $0 \le p \le i-1$。你在序列 $b$ 的第 $p+1$ 个位置(即前 $p$ 个元素之后)插入 $0$,然后将 $b$ 的前 $p$ 个元素取反。 - 更正式地说:设第 $i$ 次($1 \le i \le n$)操作前的序列 $b$ 为 $b_1, b_2, \ldots, b_{i-1}$。在第 $i$ 次操作时,你选择一个整数 $p$,$0 \le p \le i-1$,并将 $b$ 替换为 $\overline{b_1}, \overline{b_2}, \ldots, \overline{b_{p}}, 0, b_{p+1}, b_{p+2}, \ldots, b_{i-1}$。其中 $\overline{x}$ 表示二进制取反,即 $\overline{0} = 1$,$\overline{1} = 0$。 你可以在下方的说明部分找到操作的示例。 请判断是否存在一组操作序列,使得最终 $b$ 等于 $a$。如果存在,请给出一种方案。

输入格式

每个测试点包含多组测试数据。第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试数据组数。 每组测试数据的第一行包含一个整数 $n$($1 \le n \le 10^5$),表示序列 $a$ 的长度。 第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($0 \le a_i \le 1$),表示序列 $a$。 保证所有测试数据中 $n$ 的总和不超过 $10^5$。

输出格式

对于每组测试数据: - 如果无法通过上述操作使 $b$ 等于 $a$,输出一行 "NO"(不含引号)。 - 否则,第一行输出 "YES"(不含引号),第二行输出 $n$ 个整数 $p_1, p_2, \ldots, p_n$($0 \le p_i \le i-1$),表示每次操作选择的 $p$。如果有多种方案,可以输出任意一种。

说明/提示

在第一个测试点中, 1. 第一次操作前,$b = [\,]$。你选择 $p = 0$,$b$ 变为 $[\, \underline{0} \,]$。 2. 第二次操作选择 $p = 0$,$b$ 变为 $[\, \underline{0}, 0 \,]$。 3. 第三次操作选择 $p = 2$,$b$ 变为 $[\, 1, 1, \underline{0} \,]$。 4. 第四次操作选择 $p = 1$,$b$ 变为 $[\, 0, \underline{0}, 1, 0 \,]$。 5. 第五次操作选择 $p = 3$,$b$ 变为 $[\, 1, 1, 0, \underline{0}, 0 \,]$。 因此,$b$ 的变化过程为:$[\,] \xrightarrow{p = 0} [\, \underline{0} \,] \xrightarrow{p = 0} [\, \underline{0}, 0 \,] \xrightarrow{p = 2} [\, 1, 1, \underline{0} \,] \xrightarrow{p = 1} [\, 0, \underline{0}, 1, 0 \,] \xrightarrow{p = 3} [\, 1, 1, 0, \underline{0}, 0 \,]$。最终 $b$ 等于 $a$,因此这是一种可行的方案。 在第二个测试点中,$n = 1$,唯一能得到的 $b$ 是 $[\, 0 \,]$。 在第三个测试点中,共有六种可能的操作序列: 1. $[\,] \xrightarrow{p = 0} [\, \underline{0} \,] \xrightarrow{p = 0} [\, \underline{0}, 0 \,] \xrightarrow{p = 0} [\, \underline{0}, 0, 0 \,]$。 2. $[\,] \xrightarrow{p = 0} [\, \underline{0} \,] \xrightarrow{p = 0} [\, \underline{0}, 0 \,] \xrightarrow{p = 1} [\, 1, \underline{0}, 0 \,]$。 3. $[\,] \xrightarrow{p = 0} [\, \underline{0} \,] \xrightarrow{p = 0} [\, \underline{0}, 0 \,] \xrightarrow{p = 2} [\, 1, 1, \underline{0} \,]$。 4. $[\,] \xrightarrow{p = 0} [\, \underline{0} \,] \xrightarrow{p = 1} [\, 1, \underline{0} \,] \xrightarrow{p = 0} [\, \underline{0}, 1, 0 \,]$。 5. $[\,] \xrightarrow{p = 0} [\, \underline{0} \,] \xrightarrow{p = 1} [\, 1, \underline{0} \,] \xrightarrow{p = 1} [\, 0, \underline{0}, 0 \,]$。 6. $[\,] \xrightarrow{p = 0} [\, \underline{0} \,] \xrightarrow{p = 1} [\, 1, \underline{0} \,] \xrightarrow{p = 2} [\, 0, 1, \underline{0} \,]$。 没有一种方式能使 $b$ 变为 $[\, 0, 1, 1 \,]$,因此答案为 "NO"。 由 ChatGPT 4.1 翻译