两个条件

  1. 为"1"构成排列,为"0"不构成排列
  2. 无法满足要求,则返回"-1"

第一个条件:只需要正常排列,然后将最小值(例如第一个排列中的数字1)出现的地方替换为当前部分排列的最大值,使得在读取到下一个"1"之前,一直因为差一个最小值无法构成排列,此时排列为{5, 2, 3, 4, 1}。此时第二个排列也同理,假设第一个排列有5个数字,第二个排列有3个数字,那么将第六个数字6(即第二个部分排列的最小值)和第二个排列的最大值8交换位置,构成{5, 2, 3, 4, 1, 8, 7, 6},因为一直差一个最小值,所以中间的数字只需要顺序打印即可。

第二个条件:其实根据第一个条件的实现原理,除了最后一位出现了"0"无法解决(因为n个数字组成n个数的排列一定成立,这是逻辑上的不存在),其他都可以正确处理,因此一开始添加一个末尾字符判断即可。

n = int(input())

s = input()
if s[-1] == "0":
    print(-1)
    exit(0)
nice_idx = []
for idx, each in enumerate(s):
    if each == "1":
        nice_idx.append(idx)

result = [i for i in range(1, n+1)]
last_idx = 0
for each in nice_idx:
    result[last_idx], result[each] = result[each], result[last_idx]
    last_idx = each+1

print(" ".join(map(str, result)))