Submission #1305322

#TimeUsernameProblemLanguageResultExecution timeMemory
1305322thieunguyenhuySnake Escaping (JOI18_snake_escaping)C++20
0 / 100
2 ms808 KiB
#include <bits/stdc++.h> using namespace std; #define PARITY(n) (__builtin_parityll((n))) #define POPCOUNT(n) (__builtin_popcountll((n))) #define CLZ(n) (__builtin_clzll((n))) #define CTZ(n) (__builtin_ctzll((n))) #define LOG(n) (63 - __builtin_clzll((n))) #define BIT(n, i) (((n) >> (i)) & 1ll) #define MASK(i) (1ll << (i)) #define FLIP(n, i) ((n) ^ (1ll << (i))) #define ON(n, i) ((n) | MASK(i)) #define OFF(n, i) ((n) & ~MASK(i)) #define Int __int128 #define fi first #define se second typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<long long, long long> pll; typedef pair<long long, int> pli; typedef pair<int, long long> pil; typedef vector<pair<int, int>> vii; typedef vector<pair<long long, long long>> vll; typedef vector<pair<long long, int>> vli; typedef vector<pair<int, long long>> vil; template <class T1, class T2> bool maximize(T1 &x, T2 y) { if (x < y) { x = y; return true; } return false; } template <class T1, class T2> bool minimize(T1 &x, T2 y) { if (x > y) { x = y; return true; } return false; } template <class T> void remove_duplicate(vector<T> &ve) { sort (ve.begin(), ve.end()); ve.resize(unique(ve.begin(), ve.end()) - ve.begin()); } mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); long long random(long long l, long long r) { return uniform_int_distribution<long long>(l, r)(rng); } template <class T> T random(T r) { return rng() % r; } const int N = 1e6 + 5, LG = 20, M = MASK(LG); const int MOD = 1e9 + 7; const int inf = 1e9; const long long INF = 1e18; int L, q; int a[M], sos_sub[M], sos_super[M]; signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> L >> q; for (int i = 0; i < MASK(L); ++i) { char ch; cin >> ch; a[i] = ch - '0'; } for (int i = 0; i < L; ++i) for (int mask = 0; mask < MASK(L); ++mask) { if (BIT(mask, i)) sos_sub[mask] += sos_sub[mask ^ MASK(i)]; else sos_super[mask] += sos_super[mask ^ MASK(i)]; } while (q--) { string t; cin >> t; reverse(t.begin(), t.end()); // convert t to number int zeroMask = 0, oneMask = 0, twoMask = 0; for (int i = 0; i < L; ++i) { if (t[i] == '0') zeroMask |= MASK(i); if (t[i] == '1') oneMask |= MASK(i); if (t[i] == '?') twoMask |= MASK(i); } if (POPCOUNT(twoMask) <= 6) { int ans = a[oneMask]; for (int sub = twoMask; sub > 0; sub = (sub - 1) & twoMask) { ans += a[oneMask | sub]; } cout << ans << '\n'; } else if (POPCOUNT(oneMask) <= 6) { int ans = sos_sub[twoMask] * (PARITY(oneMask) == 0 ? 1 : -1); for (int sub = oneMask; sub > 0; sub = (sub - 1) & oneMask) { if (PARITY(sub) == PARITY(oneMask)) ans += sos_sub[sub | twoMask]; else ans -= sos_sub[sub | twoMask]; } cout << ans << '\n'; } else { assert(POPCOUNT(zeroMask) <= 6); int ans = sos_super[oneMask]; for (int sub = zeroMask; sub > 0; sub = (sub - 1) * zeroMask) { if (PARITY(sub)) ans -= sos_super[sub | oneMask]; else ans += sos_super[sub | oneMask]; } 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...