A
题意
思路
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+3;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
string x;
cin>>x;
int t=-1;
for(int i=0;i<x.length();i++)
if(x[i]!='a'&&t==-1)t=i;
if(t==-1)
printf("NO\n");
else{
printf("YES\n");
for(int i=0;i<x.length();i++)
{
printf("%c",x[i]);
if(x.length()-i-1==t)printf("a");
}
printf("\n");
}
}
return 0;
}
B
题意
有长度为n的两个字符串a和b,如果对于一个[1,i]中,0的数量和1的数量相等,则你可以将这个区间的所有的1变成0,0变成1,求是否可以将a变成b。
输入:
t
n
string a
string b
输出:
YES or NO
思路
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
string a, b;
cin >> n >> a >> b;
a.push_back('0');
b.push_back('0');
int cnt = 0;
for(int i = 0; i < n; i++) {
cnt += (a[i] == '1') - (a[i] == '0');//检验前缀的01个数是否相等如果相等,cnt=0
if((a[i] == b[i]) != (a[i + 1] == b[i + 1]) && cnt != 0) {
cout << "NO\n";//不合法的前缀
return;
}
}
cout << "YES\n";
}
int main() {
int t;
cin >> t;
while(t--) {
solve();
}
}