Codeforces Round #666 (Div. 2) C. Multiples of Length (贪心)

-
题意:给你一个由\(0,1,?\)组成的字符串,你可以将\(?\)任意改成\(0\)或\(1\),问你操作后能否使得该字符串的任意长度为\(k\)的区间中的\(0\)和$1的个数相等.
-
题解:我们首先看前\(k\)个字符,那么对于区间\([2,k+1]\),如果要满足条件,\(s_{k+1}=s_{1}\)一定要成立,由此我们可以推导出,\(s_{i\ mod\ k}=s_{i}\),然后模拟就可以了,具体看代码.
-
代码:
int t; int n,k; char s[N]; int cnt1,cnt2; int main() { //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); t=read(); while(t--){ n=read(); k=read(); cnt1=0; cnt2=0; scanf("%s",s); bool flag=true; for(int i=k;i<n;++i){ if(s[i]==s[i%k] || s[i]=='?') continue; if(s[i%k]=='?') s[i%k]=s[i]; else{ flag=false; break; } } for(int i=0;i<k;++i){ if(s[i]=='0') cnt1++; if(s[i]=='1') cnt2++; } if(cnt1>k/2 || cnt2>k/2) flag=false; if(flag) puts("YES"); else puts("NO"); } return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号