P16795 [蓝桥杯 2026 国 B] 奇偶校验排列

题目描述

某个校验系统需要把 $1, 2, \dots, n$ 这 $n$ 个编号各使用一次,排成一个长度为 $n$ 的序列 $p_1, p_2, \dots, p_n$。这样的序列称为一个排列。 系统会根据排列中相邻两个编号的差值奇偶性生成一个长度为 $n-1$ 的校验串。对于每个 $1 \le i < n$,第 $i$ 位校验字符 $c_i$ 按如下规则确定: * 如果 $|p_i - p_{i+1}|$ 为偶数,则 $c_i$ 为 $0$; * 如果 $|p_i - p_{i+1}|$ 为奇数,则 $c_i$ 为 $1$。 现在给定一个长度为 $n-1$ 的目标校验串 $S$。你需要构造一个排列,使它生成的校验串 $c_1 c_2 \dots c_{n-1}$ 恰好等于 $S$。 如果存在多个满足要求的排列,请输出字典序最小的一个。对于两个不同排列 $a_1, a_2, \dots, a_n$ 与 $b_1, b_2, \dots, b_n$,若存在位置 $k$,使得前 $k-1$ 个数都相同且 $a_k < b_k$,则称排列 $a$ 的字典序小于排列 $b$。 如果不存在满足要求的排列,请输出 $-1$。

输入格式

第一行包含一个整数 $n$,表示编号数量。 第二行包含一个长度为 $n-1$ 的字符串 $S$,表示目标校验串,字符串仅由字符 $0$ 和 $1$ 组成。

输出格式

如果不存在满足要求的排列,输出一行一个整数 $-1$。 否则输出一行 $n$ 个整数,表示字典序最小的合法排列。相邻两个整数之间用一个空格分隔。

说明/提示

### 【样例说明 1】 该排列对应的相邻差值依次为: * $|1-2|=1$,为奇数,对应 $1$; * $|2-4|=2$,为偶数,对应 $0$; * $|4-3|=1$,为奇数,对应 $1$; * $|3-5|=2$,为偶数,对应 $0$。 因此生成的校验串为 $1010$。在所有合法排列中,$1 \ 2 \ 4 \ 3 \ 5$ 的字典序最小。 ### 【样例说明 2】 目标校验串的每一位都是 $0$,因此任意相邻两个编号的差值都必须为偶数,也就是它们奇偶性相同。这样所有位置上的编号都必须具有相同奇偶性,但 $1$ 到 $6$ 中既有奇数也有偶数,所以无解。 ### 【样例说明 3】 输出排列生成的校验串依次为 $0$、$1$、$0$、$1$、$1$、$0$、$1$,与目标校验串 $0101101$ 相同。 ### 【评测用例规模与约定】 对于 $30\%$ 的评测用例,$2 \le n \le 8$。 对于 $60\%$ 的评测用例,$2 \le n \le 5000$。 对于所有评测用例,$2 \le n \le 2 \times 10^5$,且 $S$ 的长度为 $n-1$。