CodeForces - 1138B Circus (枚举)

本文介绍了一种针对二进制字符串的匹配算法,通过将输入的字符串s1和s2进行对比,将它们分为四类:10、11、00和01,并分别存储在四个向量中。随后,算法通过枚举10和11类型字符串的选取数量,推算出剩余类型的数量,以此来找出所有可能的匹配组合。
摘要由CSDN通过智能技术生成

🐏 🐏 🐏

将01,00,11,10分为四类,枚举每一类中第一组选的个数,我们只需要枚举10,11即可,另外两类可以简单推算出

vector<int>one,two,ow,no;
bool solve()
{
    int n;cin>>n;
    string s1,s2;cin>>s1>>s2;
    rep(i,n)
    {
        if(s1[i]=='1'&&s2[i]=='0') one.push_back(i+1);//10
        if(s1[i]=='0'&&s2[i]=='1') two.push_back(i+1);
        if(s1[i]=='1'&&s2[i]=='1') ow.push_back(i+1);
        if(s1[i]=='0'&&s2[i]=='0') no.push_back(i+1); 
    }
    for(int a=0;a<=sz(one);++a)//10
    {
        for(int b=0;b<=sz(ow);++b)//11
        {
            int aa=sz(one)- a,bb=sz(ow) - b;
            int cc=a+b-bb;
            int c=sz(two)-cc,d=n/2-a-b-c;
            int dd=sz(no) - d;
            if(c<0||d<0) continue;
            if(aa<0||bb<0||cc<0||dd<0||aa+bb+cc+dd!=a+b+c+d) continue;
            rep(i,a) cout<<one[i]<<" ";
            rep(i,b) cout<<ow[i]<<" ";
            rep(i,c) cout<<two[i]<<" ";
            rep(i,d) cout<<no[i]<<" ";
            cout<<endl;
            return 1;
        }
    }
    return 0;
}
signed main()
{
    fast;
    if(!solve())  cout<<-1<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值