Submission #1304022

#TimeUsernameProblemLanguageResultExecution timeMemory
1304022tranthanh506Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
480 ms33024 KiB
#include <bits/stdc++.h> using namespace std; #define For(i, a, b, x) for (int i = (a); i <= (b); i += (x)) #define Ford(i, a, b, x) for (int i = (a); i >= (b); i -= (x)) typedef pair<int, int> pii; long long n, q, ans, a[(1 << 22) + 5], dp1[(1 << 22) + 5], dp2[(1 << 22) + 5], one, zero, question, bitO, bitZ, bitQ; string s; char x; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("voi.inp", "r", stdin); // freopen("voi.out", "w", stdout); cin >> n >> q; For(i, 0, (1 << n) - 1, 1){ cin >> x; a[i] = dp1[i] = dp2[i] = x - '0'; } For(i, 0, n - 1, 1){ For(mask, 0, (1 << n) - 1, 1){ if ((mask >> i) & 1) dp1[mask] += dp1[mask ^ (1 << i)]; } } For(i, 0, n - 1, 1){ For(mask, 0, (1 << n) - 1, 1){ if (!((mask >> i) & 1)) dp2[mask] += dp2[mask | (1 << i)]; } } For(i, 1, q, 1){ cin >> s; reverse(s.begin(), s.end()); one = zero = question = ans = 0; For(j, 0, s.size() - 1, 1){ if (s[j] == '1') one |= (1 << j); if (s[j] == '0') zero |= (1 << j); if (s[j] == '?') question |= (1 << j); } bitO = __builtin_popcount(one); bitZ = __builtin_popcount(zero); bitQ = __builtin_popcount(question); if (bitQ <= 6) { ans = a[one]; for (int sub = question; sub > 0; sub = (sub - 1) & question) ans += a[sub | one]; }else if (bitO <= 6) { ans = dp1[question] * ((bitO & 1) ? -1 : 1); for (int sub = one; sub > 0; sub = (sub - 1) & one){ if ((__builtin_popcount(sub) & 1) != (bitO & 1)) ans -= dp1[sub | question]; else ans += dp1[sub | question]; } }else if (bitZ <= 6) { ans = dp2[one]; for (int sub = zero; sub > 0; sub = (sub - 1) & zero){ if ((__builtin_popcount(sub) & 1)) ans -= dp2[sub | one]; else ans += dp2[sub | one]; } } 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...