题目描述
对于一个长度为n的01序列
你可以进行以下任意次操作:
1、选择两个下标1≤i,j≤n(i≠j)
2、记x=ai xor aj ,y=ai or aj 其中xor表示按位“异或”,or表示按位 “或” (不懂异或运算和或运算的点这里 位运算)
3、然后令aj=x , ai = y 或者 ai=y ,aj =x;
给定两个01序列 s ,t 。请你判断是否可以通过有限次(可以为0次)操作将序列 s 转化为 t。
输入
第一行一个整数k,表示数据的组数(1≤k≤1000),接下来k组数据。
每组为两个01字符串 s 和 t (1≤|s|,|t|≤1000)
注意:|s|可能不等于|t|
输出
如果可以通过有限次(可以为0次)操作将序列s变为t,输出YES,否则输出NO
样例输入
2 001 011 11 101
样例输出
YES NO
重点
10可以转换为11;11可以转为10;但00不能转为任何数,只能为00;
所以需要找到0的数目并加以特判;
讨论情况;
1.两者数目相同且全为0则输出yes
2 当两者只为一个数且不相等时输出no
3 当s或s1只有一个全全为0;
4 当两者长度相同且没有完全为0的;
5 当两者长度不同;no
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
/*重点;;;;;;
10可以转换为11;11可以转为10;但00不能转为任何数,只能为00;
所以需要找到0的数目并加以特判;
*/
char a[100010],b[100010];
scanf("%s",a);//引入两个自符串
scanf("%s",b);//
int s=0,s1=0;//计算两个字符串大小;
int c=strlen(a),d=strlen(b);
for(int i=0; i<c; i++)
if(a[i]=='0')s++;//计算a串和b串中0数目的个数;
for(int i=0; i<d; i++)if(b[i]=='0')s1++;
/*讨论情况;
1.两者数目相同且全为0则输出yes
2 当两者只为一个数且不相等时输出no
3 当s或s1只有一个全全为0;
4 当两者长度相同且没有完全为0的;
5 当两者长度不同;no
*/
if(s==c&&s1==d&&c==d)printf("YES\n");
else if((c==1&&d==1)||(s==c||s1==d))
printf("NO\n");
else if(c==d)printf("YES\n");
else printf("NO\n");
}
}