Submission #1242494

#TimeUsernameProblemLanguageResultExecution timeMemory
1242494LucasLeSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
503 ms36564 KiB
#include <bits/stdc++.h>

template<typename T>
bool minimize(T &x, T y) {
  if (x > y) {
    x = y;
    return true;
  }
  return false;
}

template<typename T>
bool maximize(T &x, T y) {
  if (x < y) {
    x = y;
    return true;
  }
  return false;
}

const int MOD = 1e9 + 7;

template<typename T>
void add(T &x, T y) {
  x += y;
  if (x >= MOD) x -= MOD;
  if (x < 0) x += MOD;
}

#define fi first
#define se second
#define pii std::pair<int, int>

int N, Q;
std::string S;

int val[(1 << 20) + 5];
int sos_sub[(1 << 20) + 5], sos_super[(1 << 20) + 5];

void solve(int _t) {
  std::cin >> N >> Q;
  std::cin >> S;
  for (int i = 0; i < (1 << N); ++i) {
    val[i] = S[i] - '0';
    sos_sub[i] = val[i];
    sos_super[i] = val[i];
  }
  for (int i = 0; i < N; ++i) {
    for (int mask = 0; mask < (1 << N); ++mask) {
      if (mask & (1 << i)) 
        sos_sub[mask] += sos_sub[mask ^ (1 << i)];
      else
        sos_super[mask] += sos_super[mask ^ (1 << i)];
    }
  }
  while (Q--) {
    std::string s;
    std::cin >> s;
    int cntO = 0, maskO = 0;
    int cntZ = 0, maskZ = 0;
    int cntQ = 0, maskQ = 0;
    for (int i = 0; i < N; ++i) {
      if (s[i] == '1') {
        cntO++;
        maskO |= (1 << (N - 1 - i));
      }
      if (s[i] == '0') {
        cntZ++;
        maskZ |= (1 << (N - 1 - i));
      }
      if (s[i] == '?') {
        cntQ++;
        maskQ |= (1 << (N - 1 - i));
      }
    }
    int mn = std::min({cntO, cntZ, cntQ}), ans = 0;
    if (cntQ == mn) {
      ans = val[maskO];
      for (int submask = maskQ; submask > 0; submask = (submask - 1) & maskQ) {
        ans += val[submask | maskO];
      }
    } else if (cntO == mn) {
      for (int submask = maskO; submask > 0; submask = (submask - 1) & maskO) {
        if ((__builtin_popcount(submask) + __builtin_popcount(maskO)) & 1)
          ans -= sos_sub[submask | maskQ];
        else
          ans += sos_sub[submask | maskQ];
      }
      if (__builtin_popcount(maskO) & 1)
        ans -= sos_sub[maskQ];
      else
        ans += sos_sub[maskQ];
    } else {
      ans = sos_super[maskO];
      for (int submask = maskZ; submask > 0; submask = (submask - 1) & maskZ) {
        if (__builtin_popcount(submask) & 1)
          ans -= sos_super[submask | maskO];
        else
          ans += sos_super[submask | maskO];
      }
    }
    std::cout << ans << '\n';
  }
}


int main() {
  // std::freopen("input.txt", "r", stdin);
  // std::freopen("i.inp", "r", stdin);
  // std::freopen("sushi.out", "w", stdout);

  std::ios_base::sync_with_stdio(false);
  std::cin.tie(0);

  clock_t start = clock();

  int tc = 1;
  // std::cin >> tc;
  for (int i = 1; i <= tc; ++i) {
    solve(i);
  }

  std::cerr << "Time elapsed: " << clock() - start << " ms\n";
}
#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...