제출 #289786

#제출 시각아이디문제언어결과실행 시간메모리
289786rama_pangSnake Escaping (JOI18_snake_escaping)C++14
100 / 100
1369 ms50540 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int L, Q; cin >> L >> Q; vector<vector<int>> A(2, vector<int>(1 << L)); vector<vector<int>> dp(2, vector<int>(1 << L)); // Subset Sum for (int i = 0; i < (1 << L); i++) { char c; cin >> c; dp[0][i] = A[0][i] = dp[1][i ^ ((1 << L) - 1)] = A[1][i ^ ((1 << L) - 1)] = (c - '0'); } for (int bit = 0; bit < 2; bit++) { for (int i = 0; i < L; i++) { for (int mask = 0; mask < (1 << L); mask++) { if (mask & (1 << i)) { dp[bit][mask] += dp[bit][mask ^ (1 << i)]; } } } } for (int qi = 0; qi < Q; qi++) { // O(Q 2^(L/3)) string s; cin >> s; reverse(begin(s), end(s)); int mask0 = 0; int mask1 = 0; int maskq = 0; for (int i = 0; i < L; i++) { if (s[i] == '0') mask0 |= 1 << i; if (s[i] == '1') mask1 |= 1 << i; if (s[i] == '?') maskq |= 1 << i; } int ans = 0; if (min(__builtin_popcount(mask0), __builtin_popcount(mask1)) < __builtin_popcount(maskq)) { if (__builtin_popcount(mask0) < __builtin_popcount(mask1)) { for (int m = mask0; ; m = (m - 1) & mask0) { ans += dp[1][(mask0 | maskq) ^ m] * ((__builtin_popcount(m) & 1) ? -1 : 1); if (!m) { break; } } } else { for (int m = mask1; ; m = (m - 1) & mask1) { ans += dp[0][(mask1 | maskq) ^ m] * ((__builtin_popcount(m) & 1) ? -1 : 1); if (!m) { break; } } } } else { for (int m = maskq; ; m = (m - 1) & maskq) { ans += A[0][mask1 | m]; if (!m) { break; } } } 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...