Submission #703109

#TimeUsernameProblemLanguageResultExecution timeMemory
703109AmirAli_H1Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
826 ms26340 KiB
// In the name of Allah #include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define all(x) (x).begin(),(x).end() #define len(x) ((ll) (x).size()) #define F first #define S second #define pb push_back #define sep ' ' #define endl '\n' #define Mp make_pair #define debug(x) cerr << #x << ": " << x << endl; #define kill(x) cout << x << '\n', exit(0); #define set_dec(x) cout << fixed << setprecision(x); #define file_io(x,y) freopen(x, "r", stdin); freopen(y, "w", stdout); int n, k, q; const int maxk = 20; const int maxn = (1 << 20) + 3; string s; int a[maxn]; int dp1[maxn], dp2[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> k >> q; n = (1 << k); cin >> s; for (int i = 0; i < n; i++) { a[i] = s[i] - '0'; } for (int i = 0; i <= k; i++) { for (int mask = n - 1; mask >= 0; mask--) { if (i == 0) { dp1[mask] = a[mask]; continue; } if (mask & (1 << (i - 1))) dp1[mask] += dp1[mask ^ (1 << (i - 1))]; } } for (int i = 0; i <= k; i++) { for (int mask = 0; mask < n; mask++) { if (i == 0) { dp2[mask] = a[mask]; continue; } if (!(mask & (1 << (i - 1)))) dp2[mask] += dp2[mask ^ (1 << (i - 1))]; } } while (q--) { cin >> s; int t0 = 0, t1 = 0, t2 = 0; int val0 = 0, val1 = 0, val2 = 0; for (int i = 0; i < k; i++) { if (s[i] == '0') { t0++; val0 += (1 << (k - i - 1)); } else if (s[i] == '1') { t1++; val1 += (1 << (k - i - 1)); } else { t2++; val2 += (1 << (k - i - 1)); } } int tm = min(min(t0, t1), t2); ll output = 0; if (tm == t0) { for (int mask = val0; mask >= 0; mask = (mask - 1) & val0) { int t = __builtin_popcount(mask); if (t % 2 == 0) output += dp2[val1 ^ mask]; else output -= dp2[val1 ^ mask]; if (mask == 0) break; } } else if (tm == t1) { for (int mask = val1; mask >= 0; mask = (mask - 1) & val1) { int t = __builtin_popcount(mask); if (t % 2 == 0) output += dp1[val2 ^ (val1 ^ mask)]; else output -= dp1[val2 ^ (val1 ^ mask)]; if (mask == 0) break; } } else { for (int mask = val2; mask >= 0; mask = (mask - 1) & val2) { output += a[val1 ^ mask]; if (mask == 0) break; } } cout << output << endl; } 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...