B. Flip the Bits

C++

#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
#define all(c) c.begin(), c.end()
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

void solve(){
    int n;
    cin >> n;
    string a, b;
    cin >> a >> b;
    vector<int> az(n, 0), ao(n, 0);
    az[0] = a[0] == '0' ? 1 : 0;
    ao[0] = a[0] == '1' ? 1 : 0;
    for(int i = 1; i < n; i++){
        az[i] = az[i-1];
        az[i] += a[i] == '0' ? 1 : 0;
        ao[i] = ao[i-1];
        ao[i] += a[i] == '1' ? 1 : 0;
    }
    bool reverse = false;
    for(int i = n-1; i >= 0; i--){
        if(!reverse){
            if(a[i] != b[i]){
                if(az[i] == ao[i]){
                    reverse = !reverse;
                }
                else{
                    cout << "NO\n";
                    return;
                }
            }
        }
        else{
            if(a[i] == b[i]){
                if(az[i] == ao[i]){
                    reverse = !reverse;
                }
                else{
                    cout << "NO\n";
                    return;
                }
            }
        }
    }
    cout << "YES\n";
}

int main(){
    fastio;
    int tc;
    cin >> tc;
    while(tc--){
        solve();
    }
    return 0;
}

항상 0, 1 의 개수가 같은 prefix 만 문자열 비트를 반전시킬 수 있다. 위치별 0, 1 의 각각의 누적합을 구해놓고 맨 오른쪽에서부터 a 와 b 의 문자가 같은지를 확인한다. 만약 문자가 다르면 해당 위치의 0, 1 의 개수를 확인한 후 같으면 반전시키고, 다르면 a 를 b 문자열로 만들 수 없으므로 NO 를 출력한다. 반복문이 끝날 때 까지 문제가 없다면 YES 를 출력한다.

후기

A 번이 A 번 답지 않게 느껴졌던 대회.

'Codeforces' 카테고리의 다른 글

Codeforces #1504A Déjà Vu  (0) 2021.04.05
Codeforces #1471A Strange Partition  (0) 2021.04.05
Codeforces #1469A Regular Bracket Sequence  (0) 2021.04.02
Codeforces #1469B Red and Blue  (0) 2021.04.02
Codeforces #1497C1 k-LCM (easy version)  (0) 2021.04.01

댓글