Daimayuan Online Judge-异或和或
题目描述
对于一个长度为 \(n\) 的 \(01\) 序列 \(a_1,a_2,…,a_n\)。
你可以执行以下操作任意多次:
- 选择两个下标 \(1≤i,j≤n(i≠j)\)。
- 记 \(x=a_i\ xor\ a_j , y=a_i\ or\ a_j\),其中 \(xor\) 表示按位异或,\(or\) 表示按位或。
- 然后令 \(a_i=x,a_j=y\) 或 \(a_i=y,a_j=x\)。
给定两个 \(01\) 序列 \(s,t\),请你判断是否可以通过有限次(可以为 \(0\) 次)操作将序列 \(s\) 变为 \(t\)。
输入格式
第一行一个整数 \(t\) , 表示数据的组数(\(1≤t≤10^3\))。接下来 \(t\) 组数据:
每组第一行一个 \(01\) 字符串 \(s(1≤|s|≤10^3)\),每组第二行一个 \(01\) 字符串 \(t(1≤|t|≤10^3)\)。
注意:\(|s|\) 可能不等于 \(|t|\)。
输出格式
如果可以通过有限次(可以为 \(0\) 次)操作将序列 \(s\) 变为 \(t\),输出 YES
,否则输出 NO
。
样例输入
2
001
011
11
101
样例输出
YES
NO
解题思路
我们来看一下所有操作的情况,一共四种:\(00\rightarrow00\),\(01\rightarrow11\),\(10\rightarrow11\),\(11\rightarrow01\),那么我们可以发现只要两个数中含有一个 \(1\),我们就可以把它们变成全为 \(1\)。那么我们只需要考虑两个序列是否同时含有 \(1\) 或者同时不含有 \(1\) 即可,如果满足则输出 YES
,否则 NO
。
C++代码
#include <bits/stdc++.h>
using namespace std;
int T;
int main()
{
cin >> T;
while(T --)
{
string s, t;
cin >> s >> t;
if(s.size() != t.size()) puts("NO");
else
{
int len = s.size();
int cs = 0, ct = 0;
for(int i = 0; i < len; i ++)
{
if(s[i] - '0') cs ++;
if(t[i] - '0') ct ++;
}
if(cs && ct || cs == ct) puts("YES");
else puts("NO");
}
}
return 0;
}
标签:01,NO,int,每日,28,cs,YES,2022.10,ct
From: https://www.cnblogs.com/Cocoicobird/p/16837088.html