CF1404A - Balanced Bitstring(数学规律+模拟+字符串+提高级)
1404A - Balanced Bitstring(源地址自⇔CF1404A)
Problem
Example
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
YES
YES
NO
YES
YES
NO
NO
YES
NO
tag:
⇔数学规律、⇔模拟、⇔字符串、⇔提高级(*1500)
题意:
对于给定的字符串,判断其每一串长度为 \(k\) 的字串中 \(0\) 和 \(1\) 的数量是否相等。其中, \(?\) 可以自由转换成 \(0\) 或者 \(1\) 。
思路:
如果这串字符串是符合规律的,那么显然的,对于每一位 s[i]
,其必定与后 \(k\) 位的 s[i+k]
值相等。
基于以上的理论反推,我们只需要判断 s[i]
是否与 s[i+k],s[i+k+k],…
相等即可。归纳后,只有一下三种情况:
s[i]
有值 \(1\) (或 \(0\) ),此后所有+k
的位置上一旦出现 \(0\) (或 \(1\) ),就输出NO
。s[i]
没有值,此后所有+k
的位置上一旦出现 \(0\) 或 \(1\) ,就给s[i]
赋值,然后回到第一条。s[i]
没有值,此后所有+k
的位置上也没有值,不用管。
最后,只需要判断前 \(k\) 位中 \(0\) 的数量是否超了 \(\frac{k}{2}\) ( \(1\) 的数量同理)即可。
AC代码:
//A WIDA Project
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define IOS() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
LL T,n,k,flag,num0,num1;
string s;
int main(){
IOS();
cin>>T;
while(T-->0){
flag=0;num0=0;num1=0;
cin>>n>>k>>s;
for(int i=0;i<k && flag==0;i++){
int len=i;
while(len<n && flag==0){
if(s[i]=='?' && s[len]!='?') s[i]=s[len];
else if(s[i]!='?' && s[len]!='?' && s[i]!=s[len]) flag=1;
len+=k;
}
if(s[i]=='1') num1++;
else if(s[i]=='0') num0++;
}
if(num0>k/2 || num1>k/2 || flag==1) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
错误次数:0次
文 / WIDA
2021.10.15成文
首发于WIDA个人博客,仅供学习讨论
更新日记:
2021.10.15 成文