CF1404A - Balanced Bitstring(數學規律+模擬+字串+提高階)
阿新 • • 發佈:2021-10-15
2021.10.15補題
,其必定與後 \(k\) 位的 的數量同理)即可。
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]
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 成文