Codeforces Round #668 (Div. 2)
(solved A B)
比赛链接 https://codeforces.com/contest/1405
C题
题目大意
给出一个长度为n的01字符串和一个整数k,问是否每个长度为k的字串0的数量都等于1的数量
字符串中还有字符?,可以被替换成0或1
题解
下标相差为k的两字符必须相等,若满足了此条件找任一长度为k的子串判断是否满足要求
( 赛后发现赛时的想法又臭又长,但是可以过题,但是代码写出问题了 两份代码都贴一下(都AC了) )
void solve(){
cin >> n >> k >> s;
int zer = 0, one = 0;
bool chk = true;
for (int i = 0; i < k; i++) {
int tmp = -1;
for (int j = i; j < n; j += k) {
if (s[j] != '?') {
if (tmp != -1 && s[j] - '0' != tmp) {
chk = false;
break;
}
tmp = s[j] - '0';
}
}
if (tmp != -1) {
(tmp == 0 ? zer : one)++;
}
}
if (max(zer, one) > k / 2) {
chk = false;
}
cout << (chk ? "YES\n" : "NO\n");
}
void solve(){
int n,k;
cin>>n>>k;
string s;cin>>s;
int cnt0=0;//0
int cnt1=0;//1
int cnt2=0;//?
for(int i=0;i<k;i++){
if(s[i]=='0')cnt0++;
else if(s[i]=='1')cnt1++;
else cnt2++;
}
if(cnt2 && abs(cnt0-cnt1)==cnt2){
char c;
if(cnt0>cnt1)c='1';
else c='0';
for(int i=0;i<k;i++){
if(s[i]=='?')s[i]=c;
}
cnt2=0;
cnt1=cnt2=k/2;
}
int left=0,right=k-1;
// CNT;
while(right<n){
if(left){
if(s[left-1]=='0'){
if(s[right]=='1'){
cout<<"NO\n";
return;
}
cnt0--;
}
else if(s[left-1]=='1'){
if(s[right]=='0'){
cout<<"NO\n";
return ;
}
cnt1--;
}
else{
cnt2--;
}
if(s[right]=='0')cnt0++;
else if(s[right]=='1')cnt1++;
else {
if(s[left-1]=='0'){
cnt0++;
s[right]='0';
}
else if(s[left-1]=='1'){
cnt1++;
s[right]='1';
}else{
cnt2++;
}
}
}
if(abs(cnt0-cnt1)>cnt2){
cout<<"NO\n";
return ;
}
left++;
right++;
}
cout<<"YES\n";
}