题面(The Problem):
题目大意(The meaning of the problem):
给定两个只包含1和0的字符串,每次操作可以选定前i个字符进行反转(1变成0,0变成1),并且保证选定的前i个字符内0和1的数量相同。如果能把第一个字符串变成第二个输出YES否则输出NO
思路(The method of solving):
0(N)记录所有1和0刚好相同的点,判断每两个点中间的字符是否相同或者取反即可。如果最后一段的1和0不相等,判断最后一段是否完全相同,如都满足则输出YES,不能则输出NO。
代码(Code):
#include "bits/stdc++.h"
using namespace std;
inline int beNum(char ch) {
return ch - '0';
}
bool cmp1(string str1, string str2) {
bool flag = true;
for (int i = 0; i < str1.length(); ++i) {
if (beNum(str1[i]) + beNum(str2[i]) != 1) {
flag = false;
break;
}
}
//cout << flag << endl;
return flag;
}
int main(void) {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string str1, str2;
cin >> str1 >> str2;
vector<int>key;
key.push_back(-1);
int num[2] = {0};
for (int i = 0; i < n; ++i) {
num[beNum(str1[i])]++;
if (num[0] == num[1]) {
key.push_back(i);
}
}
bool flag = true;
// for (int i = 0; i < key.size(); ++i) {
// cout << i << ':' << key[i] << endl;
// }
// bool flag = true;
for (int i = 1; i < key.size(); ++i) {
string temp1 = str1.substr(key[i - 1] + 1, key[i] - key[i - 1]);
string temp = str2.substr(key[i - 1] + 1, key[i] - key[i - 1]);
//cout << cmp1(temp, temp1) << endl;
if ((key[i] - key[i - 1]) % 2 == 1) {
string temp1 = str1.substr(key[i - 1] + 1, n - 1 - key[i - 1]);
string temp = str2.substr(key[i - 1] + 1, n - 1 - key[i - 1]);
//cout << temp << endl << temp1 << endl;
if (temp != temp1) {
flag = false;
}
break;
}
if (temp != temp1 && !cmp1(temp1, temp)) {
//cout << "test" << i << ' ' << key.size() - 1 << endl;
flag = false;
break;
}
}
if (key[key.size() - 1] != n - 1) {
if (str1.substr(key[key.size() - 1] + 1) != str2.substr(key[key.size() - 1] + 1)) {
flag = false;
}
}
if (flag) {
cout << "YES" << endl;
}else {
cout << "NO" << endl;
}
}
return 0;
}