Submission #673466

#TimeUsernameProblemLanguageResultExecution timeMemory
673466stevancvSnake Escaping (JOI18_snake_escaping)C++14
100 / 100
821 ms39276 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define sp ' ' #define en '\n' #define smin(a, b) a = min(a, b) #define smax(a, b) a = max(a, b) using namespace std; const int N = 1e6 + 2; const int mod = 1e9 + 7; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; int m = 1 << n; string s; cin >> s; vector<int> sum(m), asum(m); for (int i = 0; i < m; i++) sum[i] = asum[i] = s[i] - '0'; for (int j = 0; j < n; j++) { for (int i = 0; i < m; i++) { if ((1 << j) & i) sum[i] += sum[i ^ (1 << j)]; else asum[i] += asum[i ^ (1 << j)]; } } while (q--) { string t; cin >> t; reverse(t.begin(), t.end()); int x = 0, y = 0, z = 0; for (int i = 0; i < n; i++) { if (t[i] == '1') x += 1 << i; if (t[i] == '0') y += 1 << i; if (t[i] == '?') z += 1 << i; } int xx = __builtin_popcount(x); if (xx <= 6) { int ans = 0; for (int smask = x; ; smask = (smask - 1) & x) { if ((xx - __builtin_popcount(smask)) & 1) ans -= sum[smask | z]; else ans += sum[smask | z]; if (smask == 0) break; } cout << ans << en; continue; } int yy = __builtin_popcount(y); if (yy <= 6) { int ans = 0; for (int smask = y; ; smask = (smask - 1) & y) { if ((yy - __builtin_popcount(smask)) & 1) ans -= asum[(smask ^ y) | x]; else ans += asum[(smask ^ y) | x]; if (smask == 0) break; } cout << ans << en; continue; } int ans = 0; for (int smask = z; ; smask = (smask - 1) & z) { ans += s[smask | x] - '0'; if (smask == 0) break; } cout << ans << en; } 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...