Codeforces Round #712 (Div. 2) B. Flip the Bits

B. Flip the Bits

链接B. Flip the Bits

题目大意:

    给你两个只有01的字符串a和b,要求对a的前缀进行0->1和1->0的操作,
    使得a和b相同,注意,只有当a的那段前缀中的0和1数量相同时才可进行翻转。

解题思路

此题,蒟蒻一开始是不会的,参见了别人的代码~
首先,我们对a进行翻转的条件是0和1的数量相同,那么,我们用一句巧妙的代码来进行判断

 cnt += (a[i] == '1') - (a[i] == '0');

次数的cnt,初始值为0
当a[i]==1时,cnt+=1,
当a[i]==0时,cnt+=-1
也就是说,如果此时前缀的01数量相等的话,那么cnt=0
否则cnt不为0
后边的就简单了,a到b总是通过对前缀进行翻转,那么只要a和b不一样时,如果cnt=0,那么我们就可以翻转a,如果不为0的话,那么就不可能翻转得到b
代码如下:

#include <bits/stdc++.h>
 
using namespace std;
 
void solve() {
    int n;
    string a, b;
    cin >> n >> a >> b;
    a.push_back('0');
    b.push_back('0');
    int cnt = 0;
    for(int i = 0; i < n; i++) {
        cnt += (a[i] == '1') - (a[i] == '0');///统计0和1是否相等,若cnt==0则相等可翻转,否则不相等,不可翻转
        if((a[i] == b[i]) != (a[i + 1] == b[i + 1]) && cnt != 0) {///两个相邻的数01位置交叉且目前不可翻转
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int te;
    cin >> te;
    while(te--) {
        solve();
    }
}

这道题虽然不是很难,但是也能体现出编程人的功底,我参考的这个写法就很简洁,如果是本人自己写,大概写不到这种程度。

共勉

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值