题意

建议评红。

有一个 01 01 01 s s s,长度为 n n n,要求给出一个排列 p p p 1 1 1 n n n 每个数都要出现一次,对于第 i i i 个数,如果 s i s_i si 1 1 1 p i p_i pi i i i,否则 p i p_i pi 不能为 i i i

分析

如果 s s s 中有 n − 1 n-1 n1 1 1 1 则所有 p i p_i pi 一定等于 i i i,输出 − 1 -1 1

对于 s i s_i si 等于 0 0 0 的情况,我们将所有的 i i i 记录下来,然后对于记录的第 x x x 个下标 a x a_x ax,使 p a x p_{a_x} pax 等于 a x + 1 a_{x+1} ax+1

注意此处存储下标用的数组 a a a 是一个环,这样才能保证每个位置都有数可填。

代码

#include<bits/stdc++.h>
using namespace std;
long long n,a[1000005],x=0,ans[1000005]={
   0},c=0;
string s;
int main(){
   
  cin>>n>>s;
  for(int i=0;i<n;i++)
  {
   
    if(s[i]=='1')ans[i]=i+1;
    else a[x++]=i+1;//记录下标
  }
  a[x]=a[0];//围链成环
  if(x==1)//特判无解
  {
   
    cout<<-1;
    return 0;
  }
  for(int i=0;i<n;i++)
  {
   
    if(ans[i])cout<<ans[i];
    else
    {
   
      cout<<a[(c++)+1];
    }
    cout<<" ";
  }
  return 0;
}