题解:P16354 「Diligent-OI R3 B」天际线
挺有意思的一道题。
字典序最小,我们不妨从初始序列为
初始情况下肯定
然后是
:::success[code]
#include <bits/stdc++.h>
using namespace std;
int T,n,ans[100005],minn,maxx,sum;
bool flag,f;
string a,b,c;
int main(){
cin>>T;
while(T--){
cin>>n>>a>>b>>c;
a=' '+a,b=' '+b,c=' '+c,flag=f=0;
for(int i = 1;i<=n;i++)
if(c[i]=='1'&&(a[i]=='1'||b[i]=='1'))
flag=1;
for(int i = 1;i<=n;i++){
if(a[i]=='1'&&f) flag=1;
if(b[i]=='1') f=1;
}
if(c[1]=='1'||c[n]=='1') flag=1;
if(flag){cout<<"-1\n";continue;}
minn=1,maxx=n;
for(int i = 1;i<=n;i++)
if(b[i]=='1') ans[i]=maxx--,sum++;
else ans[i]=minn++;
for(int i = n;i>=1;i--)
if(b[i]=='1') sum--;
else if(c[i]=='1'&&!sum)
swap(ans[i],ans[i-1]);
if(flag){cout<<"-1\n";continue;}
for(int i = 1;i<=n;i++) cout<<ans[i]<<' ';
cout<<'\n';
}
return 0;
}
/*
1 3 2 4 5
0010
0100
*/