1 条题解

  • 0
    @ 2025-8-11 16:27:30

    O(N)O(N)

    kk 个序列( kk11 开始)以 1 开头,之后每两个 1 之间间隔 k1k-100

    首先找前缀和后缀 00 的数量,如果其中的最大值 ma>nma > n 则不匹配。

    接着再判断中间段是否匹配,即每个 11 之间连续 00 的个数 cntcnt是否相等,且要求 macntnma \leq cnt \leq n

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        int t;
        cin >> t;
        while(t--){
        	int n, m;
        	string s;
        	cin >> n >> m >> s;
        	
        	int qian = s.find('1'); //qian记录第一个1前面有几个0 
        	if(qian == -1) { //如果没有出现过1
    			if(s.size() <= n) cout << "Yes" << endl;
    			else cout << "No" << endl;
    			continue;
    		} 
    		
        	int hou = 0; //hou记录最后一个1后面有几个0 
        	for(int i = s.size() - 1; i >= 0; --i){ //从后往前找到最后一个1 
        		if(s[i] == '1') break;
        		else hou++;
    		}
    		
    		//0的个数必须小于等于n才能从序列截取,因此取前后最多的0跟n比较 
    		int ma = max(qian, hou);
    		if(ma > n) {
    			cout << "No" << endl;
    			continue;
    		}
    		
    		// 检查 '1' 之间的 '0' 的个数是否一致
    		int cnt = 0; //cnt统计两个1间隔的0的个数 
    		bool flag = true; //标记是否可以从序列中截取 
    		int jian = -1; //记录中间的1间隔的0的个数 
    		for(int i = qian + 1; i < s.size() - hou; ++i){
    			if(s[i] == '1') {
    				if(cnt < ma || cnt > n || (jian != -1 && cnt != jian)) {
    					cout << "No" << endl;
    					flag = false;
    					break;
    				} 
    				jian = cnt; //记录中间的1间隔的0的个数  
    				cnt = 0; //重新开始统计两个1间隔的0的个数  
    			}
    			else cnt++;
    		}
    		if(flag) cout << "Yes" << endl;
    	}
        return 0;
    }
     
    
    • 1

    信息

    ID
    506
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    1
    上传者