1. 程式人生 > 其它 >CF1404A - Balanced Bitstring(數學規律+模擬+字串+提高階)

CF1404A - Balanced Bitstring(數學規律+模擬+字串+提高階)

2021.10.15補題

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],… 相等即可。歸納後,只有一下三種情況:

  1. s[i] 有值 \(1\) (或 \(0\) ),此後所有 +k 的位置上一旦出現 \(0\) (或 \(1\) ),就輸出 NO
  2. s[i] 沒有值,此後所有 +k 的位置上一旦出現 \(0\)\(1\) ,就給 s[i] 賦值,然後回到第一條。
  3. 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 成文