import java.util.Scanner; /** * @author supermejane * @date 2025/10/11 12:21 * @description BGN78 小红的排列构造② */ public class Main { //题目只要是把问题想清楚,实际上代码就是一个o(n)双指针就行了 //首先第一点如果存在一个排列,那么s最后一位肯定是'1',这个是一个充分条件 //同时我们可以想的是对于任意一个'1'结尾的s,每一小段s(i) - s(j)'0001'的字串都可以是对应i - j的值的“打乱”(都不在自己位置上),那么也就是说 存在一个排列是s最后一位肯定是'1'的充要条件 //知道上面的情况只要判断结尾是否为'1',对于为'1',使用上面的结论双指针对于每一小段s(i) - s(j)'0001'输出一个“打乱”就行了 public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); in.nextLine(); String s = in.nextLine(); int len; if ((len = s.length()) != n || s.charAt(len - 1) != '1') System.out.println(-1); else { int p1 = 0, p2; boolean flag = false; for (p2 = 0; p2 < len; p2++) { if (s.charAt(p2) == '1') { for (int i = p1 + 2; i <= p2 + 1; i++) { System.out.print((flag ? " " : "") + i); flag = true; } System.out.print((flag ? " " : "") + (p1 + 1)); flag = true; p1 = p2 + 1; } } } } }