链接:
https://codeforces.com/problemset/problem/1504/B
题意:
给两个长度相同的01串,对于每个0和1数量相等的字符串前缀,可以将它们翻转1变0,0变1。问,第一个字符串,是否能通过这种方式变成第二个字符串。
对于每一个0和1数量相等的字符串前缀,只要在内的对应数字相互异或值相等即可,最后判断一下剩下的数字,是否异或值均为0即可。我们把每个01串用一个数字cnt记录0和1是否相等,当为1是cnt++,当为0时,cnt--。每当cnt等于0时(即0和1相等),就重置异或值,供后面的数字判断异或值是否一样。
代码如下:
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
using namespace std;
typedef long long ll;
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
string s1, s2;
cin >> s1 >> s2;
int c1 = 0, c2 = 0;
bool f = true;
bool flag = true;
int a;
for (int i = 0; i < n; i++) {
if (s1[i] == '1') {
c1++;
}
else if (s1[i] == '0') {
c1--;
}
if (s2[i] == '1') {
c2++;
}
else if (s2[i] == '0') {
c2--;
}
if (f) {
a = ((s1[i] - '0') ^ (s2[i] - '0'));
f = false;
}
else {
if (a != ((s1[i] - '0') ^ (s2[i] - '0'))) {
flag = false;
break;
}
if (!c1) {
f = true;
if (c2) {
flag = false;
break;
}
}
}
}
if (c1 && flag) {
if (a) {
flag = false;
}
}
if (flag) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
return 0;
}