牛客——等价串

题目
题目网址
一串长度为 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;
}
上一篇:Java实现求最大公约数


下一篇:leetcode:350.两个数组的交集 II