比赛
D
对于每个长度为 k 的子串都平衡, 我们可以推出 每个子串肯定是相同的
然后对于 长度为 k 的子串,我们去寻找每一位是否存在不为 ?的,然后将其赋给所有子串 为 ?的对应位置,如果对应位置出现不同的,则输出 No
对于未被确定的位置我们不用管,考虑前 k 个字符, 如果 1 和 0 数目小于等于 k / 2, 则一定可以平衡
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, k;
string s;
cin >> n >> k;
cin >> s;
if(k % 2 == 1) {
cout << "No\n"; return 0;
}
for(int i = 0; i < k; ++i)
{
int x = i;
if(s[i] != '?')
{
for(int j = i; j < n; j += k)
{
if(s[j] == '?') s[j] = s[i];
else if(s[j] != s[i])
{
cout << "No\n";return 0;
}
}
}
else
{
while(s[x] == '?' && x+k < n) x+=k;
if(x < n && s[x] != '?')
{
for(int j = i; j < n; j += k)
{
if(s[j] == '?') s[j] = s[x];
else if(s[j] != s[x])
{
cout << "No\n"; return 0;
}
}
}
}
}
int sum0 = 0, sum1 = 0;
for(int i = 0; i < k; ++i)
{
if(s[i] == '1') ++sum1;
else if(s[i] == '0') ++sum0;
}
if(sum1 <= k/2 && sum0 <= k/2)
{
cout << "Yes\n";
}
else cout << "No\n";
return 0;
}
该博客探讨了一种字符串平衡的算法,即对于给定长度的子串,如何判断是否能通过改变?(不确定字符)使其所有子串相同。文章首先说明了如果长度为奇数则无法平衡,然后通过迭代检查每个子串,确定每个位置的字符,如果发现不一致则输出No。在确定所有可能的情况下,如果1和0的数量都小于等于子串长度的一半,那么可以平衡,输出Yes。

被折叠的 条评论
为什么被折叠?



