对于一个长度为 n n n 的 01 01 01序列 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an。
你可以执行以下操作任意多次:
- 选择两个下标 1 ≤ i , j ≤ n ( i ≠ j ) 1≤i,j≤n(i≠j) 1≤i,j≤n(i=j)。
- 记 x = a i x o r a j x=a_i\ xor\ a_j x=ai xor aj , y = a i o r a j y=a_i\ or\ a_j y=ai or aj , 其中 x o r xor xor 表示按位异或 , o r or or 表示按位或。
- 然后令 a i = x , a j = y a_i=x,a_j=y ai=x,aj=y 或 a i = y , a j = x a_i=y,a_j=x ai=y,aj=x。
给定两个 01 01 01序列 s , t s,t s,t , 请你判断是否可以通过有限次(可以为 0 0 0次)操作将序列 s s s 变为 t t t。
输入格式
第一行一个整数 t t t , 表示数据的组数 ( 1 ≤ t ≤ 1 0 3 ) (1≤t≤10^3) (1≤t≤103)。接下来 t t t 组数据:
每组第一行一个 01 01 01字符串 s ( 1 ≤ ∣ s ∣ ≤ 1 0 3 ) s(1≤|s|≤10^3) s(1≤∣s∣≤103),每组第二行一个 01 01 01字符串 t ( 1 ≤ ∣ t ∣ ≤ 1 0 3 ) t(1≤|t|≤10^3) t(1≤∣t∣≤103)。
注意: ∣ s ∣ |s| ∣s∣ 可能不等于 ∣ t ∣ |t| ∣t∣。
输出格式
如果可以通过有限次(可以为
0
0
0次)操作将序列
s
s
s 变为
t
t
t , 输出 YES
, 否则输出 NO
。
样例输入
2
001
011
11
101
样例输出
YES
NO
样例解释
第一组数据选择 i = 2 , j = 3 i=2,j=3 i=2,j=3 , 那么 x = 1 , y = 1 x=1,y=1 x=1,y=1 , 接着令 a i = x , a j = y a_i=x,a_j=y ai=x,aj=y 即可得到 t t t 序列。
第二组数据 ∣ s ∣ = 2 , ∣ t ∣ = 3 |s|=2,|t|=3 ∣s∣=2,∣t∣=3 显然无法满足要求。
解题思路:
首先我们看一下操作的四种情况:
or xor
1 1 1 0
1 0 1 1
0 1 1 1
0 0 0 0
可以看出,对于只有 0 0 0的字符串,我们无法改变
除此之外,只有两种操作:11 -> 10
和10 -> 11
用这两种操作我们可以将含有 1 1 1的字符串变成含有任意数量 1 1 1的字符串(当然,不包括 0 0 0个 1 1 1)
所以代码实现思路很清晰了:
1)长度不一样,直接输出NO
2)长度一样,如果只有一个字符串均为
0
0
0,输出NO
3)其余情况输出YES
最后需要注意一点:
O
n
l
i
n
e
J
u
d
g
e
Online\ Judge
Online Judge的操作系统可能是
L
i
n
u
x
Linux
Linux而不是
W
i
n
d
o
w
s
Windows
Windows,这会造成换行符的不一致——
L
i
n
u
x
Linux
Linux的换行符是'\n'
,而
W
i
n
d
o
w
s
Windows
Windows的换行符是'\r' + '\n'
。
所以会导致用getchar() != \n
来判断输入结束的错误,这里采用的改进方法是使用getline(cin, string)
AC代码如下
#include <iostream>
#include <string>
using namespace std;
const int max_t = 1e3;
const int max_s = 1e3;
int t, len1, len2, sum1, sum2;
int main() {
cin >> t; cin.ignore();
string str;
for (int i = 0; i < t; i++) {
sum1 = sum2 = 0;
getline(cin, str);
len1 = str.size();
for (int i = 0; i < len1; i++) {
sum1 += str[i] - 48;
}
getline(cin, str);
len2 = str.size();
for (int i = 0; i < len2; i++) {
sum2 += str[i] - 48;
}
if (len1 != len2) cout << "NO" << endl;
else if (sum1 && !sum2 || !sum1 && sum2) cout << "NO" << endl;
else cout << "YES" << endl;
}
return 0;
}