只需要先生成一个正序排列,然后在每次遇到'0'时,将当前位置数字与后面那个交换位置即可,特判末尾有0,因为到最后一定包含了从1到n的所有数字。

#include <vector>
#include <string>
#include <iostream>
#include <numeric>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;if (s[n-1] == '0') {cout<<-1;return 0;}
    vector<int>v(n);iota(v.begin(),v.end(),1);
    for (int i = 0; i < n; i++) {
        if (s[i] == '0') 
            swap(v[i],v[i+1]);
    }
    for (int x:v)cout<<x<<' ';
    return 0;
}