Submission #1144911

#TimeUsernameProblemLanguageResultExecution timeMemory
1144911fryingducSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
814 ms17740 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 1e6 + 6;
const int MASK = (1 << 20) + 5;
int l, q, n;
string s;
int f[MASK], g[MASK];

void solve() {
  cin >> l >> q >> s;
  n = (1 << l);
  for(int i = 0; i < n; ++i) {
    f[i] = g[i] = s[i] - '0';
  }
  for(int i = 0; i < l; ++i) {
    for(int mask = 0; mask < n; ++mask) {
      if(mask >> i & 1) continue;
      g[mask] += g[mask ^ (1 << i)];
    }
    for(int mask = n - 1; mask >= 0; --mask) {
      if(mask >> i & 1) {
        f[mask] += f[mask ^ (1 << i)];
      }
    }
  }
  string t;
  int third = l / 3, res = 0;
  int c0 = 0, c1 = 0;
  while(q--) {
    cin >> t;
    reverse(t.begin(), t.end());
    res = 0;
    c0 = 0, c1 = 0;
    for(int i = 0; i < l; ++i) {
      if(t[i] == '0') ++c0;
      else if(t[i] == '1') ++c1;
    }
    vector<int> pos;
    if(l - c0 - c1 <= third) {
      int org_mask = 0;
      for(int i = 0; i < l; ++i) {
        if(t[i] == '?') {
          pos.push_back(i);
        } else if(t[i] == '1') {
          org_mask |= (1 << i);
        }
      }
      int sz = (int)pos.size();
      for(int mask = 0; mask < (1 << sz); ++mask) {
        int cur_mask = org_mask;
        for(int i = 0; i < sz; ++i) {
          if(mask >> i & 1) {
            cur_mask |= (1 << pos[i]);
          }
        }
        res += s[cur_mask] - '0';
      }
    } else if(c0 <= third) {
      int org_mask = 0;
      for(int i = 0; i < l; ++i) {
        if(t[i] == '0') {
          pos.push_back(i);
        } else if(t[i] == '1') {
          org_mask |= (1 << i);
        }
      }
      int sz = (int)pos.size();
      for(int mask = 0; mask < (1 << sz); ++mask) {
        int cur_mask = org_mask;
        for(int i = 0; i < sz; ++i) {
          if(mask >> i & 1) {
            cur_mask |= (1 << pos[i]);
          }
        }
        int sign = (__builtin_popcount(mask) & 1 ? -1 : 1);
        res += sign * g[cur_mask];
      }
    } else {
      int org_mask = 0;
      for(int i = 0; i < l; ++i) {
        if(t[i] == '1') {
          pos.push_back(i);
          org_mask |= (1 << i);
        } else if(t[i] == '?') {
          org_mask |= (1 << i);
        }
      }
      int sz = (int)pos.size();
      for(int mask = 0; mask < (1 << sz); ++mask) {
        int cur_mask = org_mask;
        for(int i = 0; i < sz; ++i) {
          if(mask >> i & 1) {
            cur_mask ^= (1 << pos[i]);
          }
        }
        int sign = (__builtin_popcount(mask) & 1 ? -1 : 1);
        res += sign * f[cur_mask];
      }
    }
    cout << res << '\n';
  }
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  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...