CF2092B Lady Bug

Posted on 2025-04-18 23:19  K_J_M  阅读(6)  评论(0)    收藏  举报

CF2092B Lady Bug

题目描述

当 Dasha Purova 刚越过法国边境时,反派 Markaron 绑架了她并将她关押在其城堡下的监狱中。幸运的是,神奇的 Lady Bug 得知 Dasha 的消息后立即赶往 Markaron 的城堡营救她。然而,她需要破解一个复杂密码才能进入。

该密码由两个长度为 \(n\) 的比特字符串 \(a\)\(b\) 组成。Lady Bug 在一次操作中可以选择任意索引 \(2 \leq i \leq n\) 并执行以下两种操作之一:

  1. 交换 \((a_i\), \(b_{i-1})\)
  2. 交换 \((b_i\), \(a_{i-1})\)

Lady Bug 可以进行任意次数的操作。若她能使第一个字符串 \(a\) 仅由 \(0\) 组成,则视为密码破解成功。请帮助她判断是否能成功营救 Dasha。

Solution

将这两个操作翻译一下就是可以走蛇形路径上的数随意交换。即 \(a\) 第一个和 \(b\) 第二个和 \(a\) 第三个等等可以随便交换。\(b\) 第一个和 \(a\) 第二个和 \(b\) 第三个等等可以随便交换。容易知道我们可以将其中一条路径上的所有 \(0\) 交换到 \(a\) 数组上面。那么我们只需要统计每一条路径上 \(0\) 的个数能否覆盖所需地方即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int t,n;
string a,b;
int main(){
    cin>>t;
    while(t--){
        cin>>n>>a>>b;
        a=" "+a,b=" "+b;
        int cnt=0,k=0;
        for(int i=1;i<=n;++i){
            if(i%2==0){
                cnt+=(b[i]=='0');
            }else{
                cnt+=(a[i]=='0');
                ++k;
            }
        }
        if(cnt<k){
            puts("NO");
        }else{
            cnt=0,k=0;
            for(int i=1;i<=n;++i){
                if(i%2==0){
                    cnt+=(a[i]=='0');
                    ++k;
                }else{
                    cnt+=(b[i]=='0');
                }
            }
            if(cnt<k){
                puts("NO");
            }else{
                puts("YES");
            }
        }
    }
    return 0;
}