Submission #649571

#TimeUsernameProblemLanguageResultExecution timeMemory
649571Alex_tz307Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
788 ms39408 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int l, q;
  string s;
  cin >> l >> q >> s;
  int n = (1 << l);
  vector<int> sub(n), super(n);
  for (int mask = 0; mask < n; ++mask) {
    sub[mask] = (s[mask] - '0');
    super[mask] = (s[mask] - '0');
  }
  for (int bit = 0; bit < l; ++bit) {
    for (int mask = 0; mask < n; ++mask) {
      if (mask & (1 << bit)) {
        sub[mask] += sub[mask ^ (1 << bit)];
      } else {
        super[mask] += super[mask | (1 << bit)];
      }
    }
  }
  for (int qq = 0; qq < q; ++qq) {
    string t;
    cin >> t;
    int mask0 = 0, mask1 = 0, maskq = 0;
    for (int i = 0; i < l; ++i) {
      if (t[i] == '0') {
        mask0 |= (1 << (l - i - 1));
      } else if (t[i] == '1') {
        mask1 |= (1 << (l - i - 1));
      } else {
        maskq |= (1 << (l - i - 1));
      }
    }
    int sum = 0, mask;
    if (__builtin_popcount(maskq) <= l / 3) {
      mask = maskq;
      while (mask) {
        sum += (s[mask1 | mask] - '0');
        mask = (mask - 1) & maskq;
      }
      sum += (s[mask1] - '0');
    } else if (__builtin_popcount(mask0) <= l / 3) {
      mask = mask0;
      while (mask) {
        if (__builtin_popcount(mask) % 2 == 0) {
          sum += super[mask | mask1];
        } else {
          sum -= super[mask | mask1];
        }
        mask = (mask - 1) & mask0;
      }
      sum += super[mask1];
    } else {
      int N = __builtin_popcount(mask1);
      mask = mask1;
      while (mask) {
        if ((N - __builtin_popcount(mask)) % 2 == 0) {
          sum += sub[mask | maskq];
        } else {
          sum -= sub[mask | maskq];
        }
        mask = (mask - 1) & mask1;
      }
      if (N % 2 == 0) {
        sum += sub[maskq];
      } else {
        sum -= sub[maskq];
      }
    }
    cout << sum << '\n';
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...