string

T1 string
有一个仅由 ‘0’ 和 ‘1’ 组成的字符串 A,可以对其执行下列两个操作:
删除 A中的第一个字符;
若 A中 ‘1’ 出现的次数为奇数,则在 A 的末尾插入 ‘1’,否则在 A的末尾插入 ‘0’.
现在给出一个同样仅由 ‘0’ 和 ‘1’ 组成的字符串 BB,请你判断 A 能否在任意多次操作后转化为 B。

输入 string.in
输入文件第一行一个正整数 T,表示有 T 组数据需要进行判断。

接下来依次输入 T组数据,每组数据有两行,其中第一行包含一个字符串 A,第二行包含一个字符串 B。

输出string.out
输出共 T 行,对应 T 组询问。若第 i组数据中 A串可以转化为 B 串则输出 “Yes”;否则输出 “No”。

输入样例 1

2

01011
0110
0011
1110
输出样例 1

Yes
No

提示
对于 20% 的数据,n≤10, T=33
对于 50% 的数据,n≤1000, T≤2020。
对于 100%的数据,n≤10^6, T≤5050。

这个题一看数据
就知道不能暴力
肯定得“归纳”:::

01011
是奇数吧?奇数的话就可以直接在后面加上1;

然后
你再去分析

在这个数的后面开始构造新的数
现在加完之后的数是:【010111】

你可以去加上0
【然后:毫无影响】
你也可以去加1
【但你需要现在前面删一个1,这样再加上一个1,总体的以数量不变,所以又可以循环】;

这里有个问题 就是你在删掉1的时候
不能删掉够构造的数里面的数
【也就是说】
当1的个数为偶数时
【大于下一个里面一个个数】
当1的个数为奇数时
【加上1,变成1的个数是偶数时,大于下一个里面1的个数】
就输出YES
否则就是NO
【因为以上推导过程只在1的个数为偶数时适用】
代码来了

**

#include<bits/stdc++.h>
    using namespace std;
    bool yes(int x,int y) {
    return x%2==0?x>y:x+1>y;
    
    }int main() {
    	int size;
    	cin>>size;
    	while(wei--) {
    		char first[1000001],second[1000001];
    		scanf("%s%s",&first,&second);
    		int number_of_1_first=0,number_of_1_second=0;
    		for(int i=0; i<strlen(first); i++) {
    			if(first[i]=='1')
    				number_of_1_first++;
    		}
    		for(int i=0; i<strlen(second); i++) {
    			if(second[i]=='1')
    				number_of_1_second++;
    		}
    		if(yes(number_of_1_first,number_of_1_second))
    		cout<<"YES"<<endl;
    		else
    		cout<<"NO"<<endl;
    	}
    	return 0;
    }

**

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值