Submission #940768

#TimeUsernameProblemLanguageResultExecution timeMemory
940768lorenzoferrariSnake Escaping (JOI18_snake_escaping)C++17
100 / 100
750 ms42212 KiB
#include "bits/stdc++.h" using namespace std; using LL = long long; static int constexpr L = 20; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int l; cin >> l; int q; cin >> q; auto neg = [&](int mask) -> int { return ~mask & ((1 << l) - 1); }; static int s[1 << L]{}; for (int i = 0; i < (1 << l); ++i) { char c; cin >> c; s[i] = c - '0'; } static int sos[2][1 << L]{}; for (int i = 0; i < (1 << l); ++i) { sos[0][i] += s[i]; sos[1][neg(i)] += s[i]; } for (int i = 0; i < l; ++i) { for (int mask = 0; mask < (1 << l); ++mask) { if (mask & (1 << i)) { sos[0][mask] += sos[0][mask ^ (1 << i)]; } } } for (int i = 0; i < l; ++i) { for (int mask = 0; mask < (1 << l); ++mask) { if (mask & (1 << i)) { sos[1][mask] += sos[1][mask ^ (1 << i)]; } } } for (int i = 0; i < q; ++i) { string t; cin >> t; int zeros = 0, ones = 0, marks = 0; for (int j = 0; j < l; ++j) { if (t[j] == '0') zeros|= (1 << (l - 1 - j)); if (t[j] == '1') ones |= (1 << (l - 1 - j)); if (t[j] == '?') marks|= (1 << (l - 1 - j)); } int c0 = __builtin_popcount(zeros); int c1 = __builtin_popcount(ones); int cm = __builtin_popcount(marks); int ans = 0; if (cm <= c0 && cm <= c1) { ans = s[ones]; for (int mask = marks; mask > 0; mask = (mask - 1) & marks) { ans += s[ones | mask]; } } else if (c1 <= c0 && c1 <= cm) { ans = sos[0][ones | marks]; for (int diff = ones; diff > 0; diff = (diff - 1) & ones) { if (__builtin_popcount(diff) & 1) { ans -= sos[0][(ones ^ diff) | marks]; } else { ans += sos[0][(ones ^ diff) | marks]; } } } else { ans = sos[1][zeros | marks]; for (int diff = zeros; diff > 0; diff = (diff - 1) & zeros) { if (__builtin_popcount(diff) & 1) { ans -= sos[1][(zeros ^ diff) | marks]; } else { ans += sos[1][(zeros ^ diff) | marks]; } } } 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...