Submission #1283147

#TimeUsernameProblemLanguageResultExecution timeMemory
1283147euthymia2606Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
464 ms20812 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> ii; const int INF = 1e9; const ll LINF = 1e18; int L, q; int toxic[1 << 20]; int sos_sub[1 << 20], sos_super[1 << 20]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> L >> q; for (int i = 0; i < (1 << L); i++) { char c; cin >> c; toxic[i] = c - '0'; } for (int mask = 0; mask < (1 << L); mask++) { sos_sub[mask] = sos_super[mask] = toxic[mask]; } for (int i = 0; i < L; i++) { for (int mask = 0; mask < (1 << L); mask++) { if (mask & (1 << i)) sos_sub[mask] += sos_sub[mask ^ (1 << i)]; else sos_super[mask] += sos_super[mask ^ (1 << i)]; } } while (q--) { string t; cin >> t; reverse(t.begin(), t.end()); int mask_z = 0, mask_o = 0, mask_q = 0; for (int i = 0; i < L; i++) { if (t[i] == '0') mask_z |= (1 << i); if (t[i] == '1') mask_o |= (1 << i); if (t[i] == '?') mask_q |= (1 << i); } int ans = 0; if (__builtin_popcount(mask_q) <= 6) { ans = toxic[mask_o]; for (int sub = mask_q; sub > 0; sub = (sub - 1) & mask_q) { ans += toxic[sub | mask_o]; } } else if (__builtin_popcount(mask_o) <= 6) { ans = (__builtin_parity(mask_o) ? -1 : 1) * sos_sub[mask_q]; for (int sub = mask_o; sub > 0; sub = (sub - 1) & mask_o) { int sign = __builtin_parity(sub) ^ __builtin_parity(mask_o) ? -1 : 1; ans += sign * sos_sub[sub | mask_q]; } } else { ans = sos_super[mask_o]; for (int sub = mask_z; sub > 0; sub = (sub - 1) & mask_z) { int sign = __builtin_parity(sub) ? -1 : 1; ans += sign * sos_super[sub | mask_o]; } } cout << ans << '\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...