ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #712 (Div. 2)(A~C)

2021-04-04 18:32:09  阅读:175  来源: 互联网

标签:pos int scanf Codeforces long 712 flag MAXN Div


A. Déjà Vu

本题的思路是找一个位置使得新添加的a所对应的字符不是a即可。

AC代码如下(可能写复杂了):

#include<bits/stdc++.h>
#define MAXN 300005
using namespace std;
typedef long long ll;
int t,pos,flag;
char s[MAXN];
int main(){
    scanf("%d",&t);
    while(t--){
        flag=0,pos=-1;
        scanf("%s",s);
        int len=strlen(s);
        for(int i=0;i<len/2;i++){
            if((s[i]!='a'&&s[i]==s[len-1-i])||(s[i]!=s[len-1-i])){
                if(s[len-1-i]=='a'){
                    for(int j=i;j<len;j++){
                        if(s[len-1-j]!='a'){
                            pos=j;
                            flag=1;
                            break;
                        }
                    }
                    break;
                }else{
                    pos=i;
                    flag=1;
                    break;
                }
            }
        }
        if((!flag)&&(len&1)){
            if(s[len/2]!='a'){
                pos=len/2;
                flag=1;
            }
        }
        if(flag){
            printf("YES\n");
            for(int i=0;i<pos;i++)
                putchar(s[i]);
            putchar('a');
            for(int i=pos;i<len;i++)
                putchar(s[i]);
            printf("\n");
        }else{
            printf("NO\n");
        }
    }
}    

B. Flip the Bits

本题是先找出a串的哪些位置可以进行转换。由于后面的位置转化后前面的也会进行转化,故我们从后面开始匹配。

我们遍历a串和b串找到他们不同的字符,表示需要奇数次转换。相同的字符则需要偶数次转换。

然后从后往前判断是否可行即可。

#include<bits/stdc++.h>
#define MAXN 300005
using namespace std;
typedef long long ll;
int t,n;
int pos[MAXN],cha[MAXN];
char a[MAXN],b[MAXN];
int main(){
    scanf("%d",&t);
    while(t--){
        int cnt=-1,cnt0=0,cnt1=0;//记录可变换的下标 
        memset(pos,0,sizeof(pos));
        memset(cha,0,sizeof(cha));
        scanf("%d",&n);
        scanf("%s%s",&a,&b);
        for(int i=0;i<n;++i){
            if(a[i]=='0')
                ++cnt0;
            else
                ++cnt1;
            if(cnt0==cnt1){
                pos[i]=1;//pos记录第i个位置是否可以进行变化 
            }
        }
        for(int i=0;i<n;++i){
            if(a[i]!=b[i])
                cha[i]=1;//需要奇数次变化
            else
                cha[i]=0;//需要偶数次变化(0也算 
        } 
        int flag=1;
        for(int i=n-1;i>=0;--i){
            if(cha[i]==flag){
                if(pos[i])//如果该位置可以变化
                    flag=1-flag;//找下一个需要偶数次变化的位置
                else{
                    printf("NO\n");
                    break;
                }
            }
            if(i==0){
                printf("YES\n");
            }
        }
    }
}    

C. Balance the Bits

首先需要判断1的个数是否为偶数。如果不是偶数则返回no,如果是偶数,再判断0是否出现在开头和结尾那个字符。如果出现则返回no。

如果以上条件都满足那么就可以构成。

对于前一半的1我们用(,后一半用),对于0我们则交替的使用(和)即可。b串反着交替)和(即可。

AC代码如下:

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
typedef long long ll;
int t,n;
char s[MAXN];
char a[MAXN],b[MAXN];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        scanf("%s",s);
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        int cnt=0;
        for(int i=0;i<n;i++){
            if(s[i]=='1'){
                ++cnt;
            }
        }
        if(cnt&1)
            printf("NO\n");
        else if(s[0]=='0'||s[n-1]=='0'){
            printf("NO\n");
        }else{
            int cnt1=0,flag=1;;
            for(int i=0;i<n;i++){
                if(s[i]=='1'){
                    ++cnt1;
                    if(cnt1<=cnt/2)
                        a[i]=b[i]='(';
                    else
                        a[i]=b[i]=')';
                }else{
                    if(flag)
                        a[i]='(',b[i]=')';
                    else
                        a[i]=')',b[i]='(';
                    flag=1-flag;
                }
            }
            printf("YES\n%s\n%s\n",a,b);
        }
    }
}    

 

标签:pos,int,scanf,Codeforces,long,712,flag,MAXN,Div
来源: https://www.cnblogs.com/mikku39/p/14616706.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有