题解:CF1404A Balanced Bitstring
找规律 + 模拟
先考虑问题的简化版:若给定的字符串只含字符 0 和 1 而无字符 ? 的干扰时该怎么做。
根据滑动窗口的思想,模拟一下不难发现若有解则一定满足
所以我们只需要判定一下字符串是否以
接下来回到本题:当存在字符 ? 的影响时该这么做。
其实也不复杂,还是根据周期第一段来枚举所有相隔 ?,且与之相关联的位置存在不为 ? 的字符,则考虑直接将第一段的位置 ? 进行替换。最后,若在找遍整个串中所有与
当然还有一个情况,若周期第一段的一个位置 ?,即位置 0 或 1,那么我们就需要考虑一下周期第一段的这个字符 ? 能否通过合理的构造使得符合题意。
也就是要考虑周期第一段是否满足字符 0 和字符 1 的个数相等。
- 如果周期第一段已经不存在字符
?,且满足字符0与字符1的个数相等,有。 - 如果周期第一段存在字符
?且个数为cnt ,且周期第一段中字符0与字符1之间还需要再添加diff 个字符才能使得字符0和字符1个数相等,则当cnt-diff 为偶数时有解。
#define rep(x,y,z) for(int x=y;x<=z;x++)
int n,k;
void solve(){
cin>>n>>k;
string s;
cin>>s;
s=" "+s;
rep(i,1,k){
for(int j=i;j<=n;j+=k){
if(s[i]=='?' && s[j]!='?') s[i]=s[j];
else if(s[i]!='?' && s[j]!='?' && s[i]!=s[j]) return cout<<"NO",void();
}
}
int cnt0=0,cnt1=0,cnt2=0;
rep(i,1,k){
if(s[i]=='0') cnt0++;
else if(s[i]=='1') cnt1++;
else cnt2++;
}
if(!cnt2 && cnt0==cnt1) return cout<<"YES",void();
if(cnt2>=abs(cnt0-cnt1) && (cnt2-abs(cnt0-cnt1))%2==0) return cout<<"YES",void();
cout<<"NO";
}