Submission #1295619

#TimeUsernameProblemLanguageResultExecution timeMemory
1295619dsfdsfsSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1158 ms26060 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int k; int q; cin >> k >> q; int N = 1 << k; int n = N; vector<long long> freq(N, 0); string d; cin >> d; for (int i = 0; i < n; i++) { int x = d[i] - '0'; freq[i] += x; } vector<long long> H = freq; for (int bit = 0; bit < k; bit++) { for (int mask = 0; mask < N; mask++) { if (mask & (1 << bit)) { H[mask] += H[mask ^ (1 << bit)]; } } } while (q--) { string a; cin >> a; int m1 = 0, m2 = 0; int u = 0; int y = (int) a.size() - 1; for (int i = 0; i < a.size(); i++) { if (a[i] == '1') { m1 += (1 << (y - i)); m2 += (1 << (y - i)); } if (a[i] == '?') { u++; m2 += (1 << (y - i)); } } if (u <= 10) { int x1 = m2 - (m1 & m2); int Y = x1; int cnt = 0; while (true) { cnt += ((d[Y | m1]) - '0'); if (Y == 0) { break; } Y = (Y - 1) & x1; } cout << cnt << '\n'; continue; } long long ans = 0; int X = m1; while (true) { int sign = (__builtin_popcount(X) & 1) ? -1 : +1; ans += sign * H[m2 & ~X]; if (X == 0) break; X = (X - 1) & m1; } 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...