其他分享
首页 > 其他分享> > Codeforces Round #712 (Div. 2)

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