Codeforces 更换
题目来源:问题 - 2029B - Codeforces
这道题要求每次合并的两个字母不能相同,那么就是每次合并一个1一个0。合并后,由于这两个字符要被替换掉,也就是说如果替换成1,那么整个字符串就少了一个0;如果替换成0,那么整个字符串就少了个1。
我们先统计原字符串中0和1的个数,如果在原字符串中,0和1其中任意一个个数为0,那么就不能完成替换,直接输出No。随后遍历数组,每次执行替换前先进行判断剩下的字符串中0和1的个数是否为0,只要有一个为0,那么就不能完成n-1次替换,输出no。
替换时要根据要替换的字符来对原字符串的0和1个数进行加减,如果顶替上的字符是1,那么原字符串的0个数就要减一,如果是0,那么原字符串的1个数减一,如果可以执行n-1次,那么就算成功,输出yes
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{int t;cin>>t;while(t--){int n,z=0,o=0;cin>>n;string stl,str;cin>>stl;cin>>str;for(int i=0;i<n;i++){if(stl[i]=='0'){z++; }}o=n-z;if(z==0||o==0){cout<<"NO"<<endl;continue;}int flag=0;for(int i=0;i<n-1;i++){if(z==0||o==0){cout<<"NO"<<endl;flag=1;break;}if(str[i]=='1'){z--;}else{o--;}}if(!flag){cout<<"YES"<<endl;}}return 0;
}