Codeforces Round #712 (Div. 2)
作者:互联网
A. Déjà Vu
题意:插入一个字符‘a’,输出非回文串。
题解:思维。首先全是‘a’肯定不行。往连续’a‘多的一边插入’a’,多的越多,少的越少,那么该字符串就一定不是回文串。
#include<bits/stdc++.h>
using namespace std;
char s[300010];
int main()
{
int t;scanf("%d", &t);
while (t--){
scanf("%s", s);
int i, l = strlen(s), s1 = 0, s2 = 0;
for (i = 0; i < l; i++){
if (s[i] == 'a') s1++;
else break;
}
for (i = l - 1; i >= 0; i--){
if (s[i] == 'a') s2++;
else break;
}
if (s1 == l) printf("NO\n");
else{
if (s1 >= s2){
printf("YES\n");
printf("a%s\n", s);
}
else{
printf("YES\n");
printf("%sa\n", s);
}
}
}
}
B. Flip the Bits
题意:可以翻转任意长度的01个数相同的前缀,使得a与b串相同。
题解:思维。当第i位和第i+1位不同时,不同的部分必须翻转,相同的部分需要在第i+1位时再翻转一次才能恢复原状。所以如果当前位需要翻转但不能翻转时,就不能相同。
#include<bits/stdc++.h>
using namespace std;
char a[300010], b[300010];
int main()
{
int t, n, i;scanf("%d", &t);
while (t--){
scanf("%d%s%s", &n, a, b);
int x = 0;
a[n] = b[n] = '0';
for (i = 0; i < n; i++){
if (a[i] == '1') x++;
else x--;
if ((a[i] == a[i + 1]) != (b[i] == b[i + 1]) && x){//cnt=0表示01个数相同,可以翻转
printf("NO\n");
break;
}
}
if (i == n) printf("YES\n");
}
}
C. Balance the Bits
题意:a、b串都由合法括号组成。如果si=1,ai=bi;si=0,ai!=bi。输出a、b串。
题解:首先判断不能的情况:两端不是1(首尾必须是"()");0的个数不是偶数(奇数会多出一个左括号或右括号)。再就是如何构造,如果是1,让a、b串的前一半为’(’,后一半为’)’;如果是0,第奇数个0时ai为’(’、bi为’)’,第偶数个0时ai为’)’、bi为’(’。
#include<bits/stdc++.h>
using namespace std;
char s[200010], a[200010], b[200010];
int main()
{
int t, n, i;scanf("%d", &t);
while (t--){
scanf("%d%s", &n, s);
if (s[0] == '0' || s[n - 1] == '0'){
printf("NO\n");
continue;
}
int cnt0 = 0, cnt1 = 0;
for (i = 0; i < n; i++)
if (s[i] == '0') cnt0++;
if (cnt0 % 2){
printf("NO\n");
continue;
}
printf("YES\n");
int c0 = 0, c1 = 0;
cnt1 = n - cnt0;
for (i = 0; i < n; i++){
if (s[i] == '0'){
c0++;
if (c0 % 2) a[i] = '(', b[i] = ')';
else a[i] = ')', b[i] = '(';
}
else{
c1++;
if (c1 <= cnt1 / 2) a[i] = b[i] = '(';
else a[i] = b[i] = ')';
}
}
a[n] = b[n] = '\0';//注意加结束符
printf("%s\n%s\n", a, b);
}
}
标签:++,scanf,Codeforces,712,int,printf,--,Div,else 来源: https://blog.csdn.net/qq_45900709/article/details/115534065