1 条题解
-
0
第 个序列( 从 开始)以 1 开头,之后每两个 1 之间间隔 个 。
首先找前缀和后缀 的数量,如果其中的最大值 则不匹配。
接着再判断中间段是否匹配,即每个 之间连续 的个数 是否相等,且要求
#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
- 上传者