题目链接:codeforces 1405C. Balanced Bitstring
题意:
给一个长度为n的字符串,求如果所有长度为 k 的子串中1和0的个数相等,返回YES,否则返回NO
其中 ? 可以代替0或1。
解题思路
由于是所有子串,所以前面少一个数,后面相对应的需要和这个数相同。需要 s[i%k] = s[i] ,如果两个都为 ? ,那么就不用操作,如果s[i%k] = ? 而s[i] != ? 需要将s[i%k] 赋值为 s[i] , 最后判断前k个字符中的0和1的个数是否相等
#include <bits/stdc++.h>
using namespace std;
const int maxn = 300005;
int main(){
int t;
cin >> t;
while(t--) {
int n, k;
cin >> n >> k;
string s;
cin >> s;
bool ans = true;
for(int i = k; i < n; i++) {
if(s[i] == '?' || s[i] == s[i%k]) {
continue;
}
if(s[i%k] == '?') {
s[i%k] = s[i];
} else {
ans = false;
break;
}
}
int s0 = 0, s1 = 0;
for(int i = 0; i < k; i++) {
if(s[i] == '0') {
s0++;
} else if(s[i] == '1') {
s1++;
}
}
if(s0 > k/2 || s1 > k/2) {
ans = false;
}
if(ans) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}