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();
    }
}

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

共勉

猜你喜欢

转载自blog.csdn.net/QWERKSDFMKD/article/details/115435343