题目
题目网址
一串长度为 n 的字符串 A 和一串长度为 m 的字符串 B。并且这两串字符串只会含有 0 或 1 。
铁子可以对字符串 A 执行两种操作,两种操作可以执行任意次。
操作1(无情替换):铁子可以用 11 替换掉 0 ,也可以用 00 替换掉 1 .
操作2(极限删除):铁子可以删除掉 111 ,也可以删除 000 .
现在问,字符串 A 可以变成字符串 B 吗?
输入描述:
第一行有一个整数T,表示有T(1<=T<=1000)组测试数据。
接下来的每组数据,第一行有两个整数n,m(1<=n,m<=100),表示字符串A和字符串B的长度。
接下来有两行字符串,分别表示字符串A和字符串B
输出描述:
对于每组测试数据,如果字符串A可以变为字符串B,则输出一行”YES”,否则输出一行”NO”.输出不包括引号。
输入
3
3 4
010
1110
3 4
010
1111
7 2
0001000
00
输出
YES
NO
YES
对于第一个样例,铁子可以对字符串A使用一次无情替换可以变成1110
思路:
可以将A串和B串都转换为只有1或者只有0的字符串。
笔者就先讲只有1的了:
分别记录A和B转换为1后的1的个数(t1、t2),如果t1、t2两者相差3*n(n=0、1、2……)即3的倍数个1,这A可以转换为B。
因为3个1可以被删除,所以3*n个1也可以被删除,删除掉后A与B就相等了
对A:
注意到操作1、2只可以对A进行操作,所以先将A全部转换为1
一个0换为两个1
这样A就很好全部变为1了
想知道最后有几个1,只要记录0的个数(n1)就可以了
A中1的个数:n1*2+n2(n2是0的个数)
再对B:
注意到操作1、2只可以对A进行操作,而且B是由A转换来的,那么B里面的0只能有一种来的途径(11–>0)两个一变为一个0,所以只要记录0的个数就可以得到最后有几个1了,和A一样。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int t,kk1,kk2,n1,n2,t1,t2,i;
cin>>t;
while(t--){
cin>>kk1>>kk2;
char s1[1000],s2[1000];
scanf("%s%s",s1,s2);
n1=n2=0;
for(i=0;s1[i]!='\0';i++){
if(s1[i]=='0') n1++;
else n2++;
}
t1=n1*2+n2;
n1=n2=0;
for(i=0;s2[i]!='\0';i++){
if(s2[i]=='0') n1++;
else n2++;
}
t2=n1*2+n2;
int k=(fabs(t1-t2));
if(k%3==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
// cout<<t1<<" "<<t2<<" "<<k<<endl;
}
return 0;
}