C. Balanced Bitstring
Description
定义一个字符串为\(k-balanced\)字符串,当且仅当字符串中包含有\(k/2\)个\(0\)和\(1\)
先给定一个\(n\)长度的\(0\),\(1\)字符串,其中存在未知位数的未知值,用\(?\)表示。
试问能否存在这样的一种情况使得该\(n\)长度的字符串能够满足任一\(k\)长度子串均为\(k-balanced\)字符串
Input
第一行输入测试用例组数\(t\)
之后每一组输入包含两行,第一行一个整数\(n\)和\(k\)
第二行为\(n\)长度的字符串,保证仅包含\(0\),\(1\),\(?\)三种元素
Output
一行输出\(YES\)或\(NO\)
Analysis
无技术含量,直接利用对应关系确定每一个\(i+p*k\) (\(p\)从0起始),是否存在冲突关系即可
Accepted Code
#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; typedef long long ll; template <class T> void _R(T &x) { cin >> x; } void _R(int &x) { scanf("%d", &x); } void _R(long long &x) { scanf("%lld", &x); } void _R(double &x) { scanf("%lf", &x); } void _R(char &x) { scanf(" %c", &x); } void _R(char *x) { scanf("%s", x); } template <class T> void _W(const T &x) { cout << x; } void _W(const int &x) { printf("%d", x); } void _W(const long long &x) { printf("%lld", x); } void _W(const double &x) { printf("%.16f", x); } void _W(const char &x) { putchar(x); } void _W(const char *x) { printf("%s", x); } char in[300005]; int sen[300005]; int main() { int t; _R(t); while (t--) { int n, k; _R(n); _R(k); _R(in); for (int i = 0; i < n; i++) { sen[i] = in[i] - '0'; if (sen[i] > 1) { sen[i] = -1; } } int cnt = 0; int que = 0; int flag = 1; for (int i = 0; i < k; i++) { if (sen[i] == 1) { cnt++; } else if (sen[i] == -1) { que++; } } if (cnt + que >= k / 2 && cnt <= k / 2) { flag = 1; } else { flag = 0; } if (flag == 1) { for (int i = 0; i < k && flag; i++) { if (flag == 0) break; int f = sen[i]; if (f == -1) { for (int j = i; j < n; j += k) { if (sen[j] != f) { f = sen[j]; break; } } } if (f != -1) { for (int j = i; j < n; j += k) { if (sen[j] == -1) { sen[j] = f; } else if (sen[j] != f) { flag = 0; break; } } } } } if (flag) //再次判断头部能否合法 { cnt = 0; que = 0; for (int i = 0; i < k; i++) { if (sen[i] == 1) { cnt++; } else if (sen[i] == -1) { que++; } } if (!(cnt + que >= k / 2 && cnt <= k / 2)) { flag = 0; } } if (flag) { _W("YES\n"); } else { _W("NO\n"); } } return 0; }