这题读完后大概率会想到分类讨论去做。
但是,这题分类讨论太毒了,各种情况都要处理的很细节,一不小心就写错了
用公式表示,然后暴力就好了
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int v1=0,v2=0,v3=0,v4=0;
string s,t;
int query(int a,int b,int c,int d)
{
if(a+b+c+d!=n/2)
{
return 0;}
if(a<0||b<0||c<0||d<0)
{
return 0;}
if(a>v1||b>v2||c>v3||d>v4)
{
return 0;}
if((b+d)!=(v3-c+v4-d))
{
return 0;}
return 1;
}
void pp(int a,int b,int c,int d)
{
for(int i=0;i<n;i++)
{
if(s[i]=='0'&&t[i]=='0'&&a>0){
cout<<i+1<<" ";a--;}
if(s[i]=='1'&&t[i]=='0'&&b>0){
cout<<i+1<<" ";b--;}
if(s[i]=='0'&&t[i]=='1'&&c>0){
cout<<i+1<<" ";c--;}
if(s[i]=='1'&&t[i]=='1'&&d>0){
cout<<i+1<<" ";d--;}
}
cout<<endl;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
cin>>s;
cin>>t;
for(int i=0;i<n;i++)
{
if(s[i]=='0'&&t[i]=='0')
{
v1++;}
if(s[i]=='1'&&t[i]=='0')
{
v2++;}
if(s[i]=='0'&&t[i]=='1')
{
v3++;}
if(s[i]=='1'&&t[i]=='1')
{
v4++;}
}
int a,b,c,d,flag=0;
for(int i=0;i<=n/2;i++)
{
for(int j=0;j<=i;j++)
{
b=j;
d=i-b;
c=v3+v4-d-i;
a=n/2-d-b-c;
if(query(a,b,c,d))
{
flag=1;
pp(a,b,c,d);
break;
}
}
if(flag){
break;}
}
if(!flag)
{
cout<<"-1"<<endl;}
return 0;
}