标签:force putc name i++ std -- 转换 space ==
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); } } }
Codeforces Round #712 (Div. 2)(A~C)
标签:force putc name i++ std -- 转换 space ==
原文地址:https://www.cnblogs.com/mikku39/p/14616706.html