2022.10.28每日一题

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;
}
posted @ 2022-10-28 18:37  Cocoicobird  阅读(40)  评论(0)    收藏  举报