Advertisement
tumaryui

Untitled

Sep 6th, 2020
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace std;
  5. using namespace __gnu_pbds;
  6.  
  7. #define int long long
  8. #define pb push_back
  9. #define all(s) s.begin(),s.end()
  10. #define rall(s) s.rbegin(),s.rend()
  11. #define pii pair<int,int>
  12. #define fr first
  13. #define sc second
  14. #define bst ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  15. #define endl "\n"
  16. #define no cout << "NO" << endl;
  17. #define yes cout << "YES" << endl;
  18. typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
  19.  
  20. const int N = 5e5 + 10, mod = 1e9 + 7, inf = 1e18 + 7, logn = 23;
  21. const double pi = acos(-1);
  22.  
  23.  
  24. void solve() {
  25. //soln
  26. int n, k;
  27. cin >> n >> k;
  28. string s;
  29. cin >> s;
  30. bool fine = 1;
  31. vector<int> pr(3); // 0 1 ?
  32. for(int i = 0; i < n; i++) {
  33. if(s[i] == '?') {
  34. pr[2]++;
  35. } else {
  36. pr[s[i] - '0']++;
  37. }
  38. fine &= (pr[0] <= k / 2);
  39. fine &= (pr[1] <= k / 2);
  40. if(i > k) {
  41. vector<int> cur = pr;
  42. if(s[i - k] == '?') {
  43. cur[2]--;
  44. } else {
  45. cur[s[i - k] - '0']--;
  46. }
  47. int n1pr = k / 2 - pr[1];
  48. int n0pr = k / 2 - pr[0];
  49. int n1cr = k / 2 - cur[1];
  50. int n0cr = k / 2 - cur[0];
  51. fine &= (n1pr >= 0);
  52. fine &= (n1cr >= 0);
  53. fine &= (n0pr >= 0);
  54. fine &= (n0cr >= 0);
  55. if(s[i] != '?' && s[i - k] != '?') {
  56. fine &= (n1pr == n1cr);
  57. fine &= (n0pr == n0cr);
  58. } else {
  59. fine &= ((n1pr + n0pr) == pr[2]);
  60. fine &= ((n1cr + n0cr) == pr[2]);
  61.  
  62. int midq = cur[2] - (s[i] == '?') - (s[i - k] == '?');
  63. int tmp = min(n1pr, n1cr);
  64. midq -= tmp;
  65. n1pr -= tmp;
  66. n1cr -= tmp;
  67. tmp = min(n0pr, n0cr);
  68. midq -= tmp;
  69. n0pr -= tmp;
  70. n0cr -= tmp;
  71. fine &= (midq != 0);
  72. fine &= (n1pr >= 0);
  73. fine &= (n0pr >= 0);
  74. fine &= (n1cr >= 0);
  75. fine &= (n0cr >= 0);
  76. //some ? in edge
  77. }
  78. }
  79. }
  80. if(fine) {
  81. yes;
  82. } else {
  83. no;
  84. }
  85.  
  86. }
  87.  
  88. main() {
  89. bst;
  90. int t = 1;
  91. cin >> t;
  92. while(t--) {
  93. solve();
  94. }
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement