【Codeforces Round #668 (Div. 2) C】Balanced Bitstring
题目链接
翻译
给你一个长度为 的字符串,让你判断这个字符串中是否每个长度为 的子串中 和 的个数都相同
这个字符串中只会包含 和 还有 ?
, 这里的 ?
是通配符。
题解
以 为例子, 假设 s[1..4]
是符合要求的, 那么我们紧接着看 s[2..5]
,不难发现。
s[2..5]
也满足要求的话,必然有 s[1]==s[5]
。因为, 整个字符串相当于少了一个 s[1]
然后多了一个 s[5]
。
所以有,对于任意的 ∈ 有 s[i] = s[i+k]
。
那么我们只需要看 这一段就好了,对于 ∈ ,应该有
那么对于 这些字符要么全为 (对于这样的 记录为 ) 要么全为 (对于这样的 记录为 ), 或者全是问号 (如果某个 里面有 又有 , 则直接无解)。
如果 和 的值都小于 ,说明可以用全是问号的 进行补充使得 这一段满足要求,即 和 的个数相同 (否则,无法凑够 和 一样,同样无解)。
只要第一段满足要求了,根据我们上面的 , 后面的所有长度为 的子串肯定也是满足要求的。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5;
int n, k, cnt[N + 10][2];
string s;
int main(){
#ifdef LOCAL_DEFINE
freopen("E://9.AlgorithmCompetition//Visitor.txt","r",stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
int T;
cin >> T;
while (T--){
for (int i = 0;i < k; i++){
cnt[i][0] = cnt[i][1] = 0;
}
cin >> n >> k;
cin >> s;
for (int i = 0;i < n; i++){
if (s[i] == '0'){
cnt[i%k][0]++;
}else if (s[i] == '1'){
cnt[i%k][1]++;
}
}
bool ok = true;
int cnt0 = 0,cnt1 = 0;
for (int i = 0;i < k; i++){
if (cnt[i][0] > 0 && cnt[i][1] > 0){
ok = false;
break;
}else{
if (cnt[i][0] > 0){
cnt0++;
}else if (cnt[i][1] > 0){
cnt1++;
}
}
}
if (cnt0 > k/2 || cnt1 > k/2){
ok = false;
}
if (ok){
cout <<"YES"<< endl;
}else{
cout <<"NO"<<endl;
}
}
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 历时 8 年,我冲上开源榜前 8 了!
· 物流快递公司核心技术能力-海量大数据处理技术
· 四大AI编程工具组合测评
· 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案
· 几个技巧,教你去除文章的 AI 味!