Problem - 1405C - Codeforces
一个比特串是一个只由0和1字符组成的字符串,如果这个比特串的每个大小为k的子串都有相同数量的0和1字符(各为k2),那么这个比特串就被称为k平衡的。
给你一个整数k和一个只由0,1,和?组成的字符串s. 你需要确定是否可以通过将s中的每一个? 字符替换为0或1来构成一个k平衡的位串.
如果一个字符串a可以通过从b中删除几个(可能是0或全部)字符的开头和几个(可能是0或全部)字符的结尾而得到,那么这个字符串就是一个字符串b的子串。
输入
每个测试包含多个测试案例。第一行包含测试用例的数量t(1≤t≤104)。测试用例的描述如下。
每个测试用例的第一行包含两个整数n和k(2≤k≤n≤3⋅105,k为偶数)--字符串的长度和平衡位串的参数。
下一行包含字符串s(|s|=n)。给定s只由0、1和?
保证所有测试案例的n之和不超过3⋅105。
输出
对于每个测试用例,如果我们能用0或1替换s中的每个?,从而使产生的位串是k平衡的,则打印YES,如果不可能,则打印NO。
例子
input
9
6 4
100110
3 2
1?1
3 2
1?0
4 4
????
7 4
1?0??1?
10 10
11??11??11
4 2
1??1
4 4
?0?0
6 2
????00
output
是
是的
没有
是
是
没有
没有
是
无
注意
对于第一个测试案例,该字符串已经是一个4平衡的位串。
对于第二个测试案例,该字符串可以转化为101。
对于第四个测试用例,该字符串可以转化为0110。
对于第五个测试案例,该字符串可以转化为1100110。
题解:
本题要求长度为k的子串包含的01的数目相同,
那么假如前k个符合条件,那么对于2~k+1的子串
第a[k+1]应该等于a[1],
因为如果前k个符合条件,现在第一个可能是0或1,少了一个,后面肯定要加上,
所以有了一个规律a[i%k] == a[i]
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
char a[300050];
void solve()
{
int n,k;
cin >> n >> k;
cin >> a;
int f = 0;
for(int i = k;i < n;i++)
{
if(a[i] == '?'||a[i%k] == a[i])
{
continue;
}
if(a[i%k] == '?')
{
a[i%k] = a[i];
}
else
{
f = 1;
break;
}
}
int x = 0,y = 0;
for(int i = 0;i < k;i++)
{
if(a[i] == '1')
{
x++;
}
else if(a[i] == '0')
{
y++;
}
}
if(x > k/2||y > k/2||f)
{
cout<<"NO\n";
}
else
{
cout<<"YES\n";
}
}
int main()
{
int t = 1;
cin >> t;
while(t--)
{
solve();
}
}
//
//