Submission #861864

#TimeUsernameProblemLanguageResultExecution timeMemory
861864NeroZeinSnake Escaping (JOI18_snake_escaping)C++17
100 / 100
1365 ms42196 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef Nero
#include "Deb.h"
#else
#define deb(...)
#endif

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int l, q;
  cin >> l >> q;
  int n = (1 << l); 
  vector<int> a(n); 
  for (int i = 0; i < n; ++i) {
    char c;
    cin >> c;
    a[i] = c - '0'; 
  }
  vector<int> sub(n); 
  for (int i = 0; i < n; ++i) {
    sub[i] = a[i]; 
  }
  for (int j = 0; j < l; ++j) {
    for (int s = 0; s < n; ++s) {
      if (s >> j & 1) {
        sub[s] += sub[s ^ (1 << j)];
      }
    }
  }
  vector<int> sup(n);
  for (int i = 0; i < n; ++i) {
    sup[i] = a[i];
  }
  for (int j = 0; j < l; ++j) {
    for (int s = 0; s < n; ++s) {
      if (!(s >> j & 1)) {
        sup[s] += sup[s | (1 << j)];
      }
    }
  }
  while (q--) {
    string qs;
    cin >> qs;
    int msk = 0;
    vector<int> zeros, ones, qm;
    for (int i = 0; i < l; ++i) {
      if (qs[i] == '0') {
        zeros.push_back(l - i - 1);
      } else if (qs[i] == '1') {
        ones.push_back(l - i - 1); 
        msk |= 1 << (l - i - 1);
      } else {
        qm.push_back(l - i - 1);
      }
    }
    int ans = 0; 
    if (qm.size() <= 6) {
      int m = (int) qm.size();
      for (int i = 0; i < (1 << m); ++i) {
        int msk2 = 0;
        for (int j = 0; j < m; ++j) {
          if (i >> j & 1) {
            msk2 |= 1 << qm[j]; 
          }
        }
        ans += a[msk | msk2]; 
      }
    } else if (ones.size() <= 6) {
      int m = (int) ones.size(); 
      for (int i = 0; i < (int) qs.size(); ++i) {
        if (qs[i] == '?') {
          msk |= 1 << (l - i - 1); 
        } else if (qs[i] == '1') {
          msk ^= 1 << (l - i - 1); 
        }
      }
      for (int i = 0; i < (1 << m); ++i) {
        int msk2 = 0; 
        bool even = true; //is off even or not
        for (int j = 0; j < m; ++j) {
          if (!(i >> j & 1)) {
            even ^= 1; 
          } else {
            msk2 |= 1 << ones[j];             
          }
        }
        ans += (even ? 1 : -1) * sub[msk | msk2];
      }
    } else {
      int m = zeros.size();
      for (int i = 0; i < (1 << m); ++i) {
        int msk2 = 0;
        bool even = true; 
        for (int j = 0; j < m; ++j) {
          if (i >> j & 1) {
            even ^= 1; 
            msk2 |= 1 << zeros[j];
          }
        }
        ans += (even ? 1 : -1) * sup[msk | msk2];
      }
    }
    cout << ans << '\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...