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;
}
**