Submission #1162428

#TimeUsernameProblemLanguageResultExecution timeMemory
1162428cpismylifeOwOSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1289 ms20680 KiB
#include <bits/stdc++.h> using namespace std; const long long mod = 1e9 + 7; const int MaxN = (1 << 20) + 5; int l, q; int arr[MaxN]; void Inp() { cin >> l >> q; for (int x = 0; x < (1 << l); x++) { char a; cin >> a; arr[x] = a - '0'; } } int po[2] = {1, -1}; int Pre1[MaxN]; int Pre2[MaxN]; string s; int Sub1(int i, int cur) { if (i >= l) { return arr[cur]; } if (s[i] == '?') { return Sub1(i + 1, cur) + Sub1(i + 1, cur ^ (1 << i)); } return Sub1(i + 1, cur ^ ((s[i] - '0') << i)); } int Sub2(int i, int cur, bool md2) { if (i >= l) { return Pre1[cur] * po[md2]; } if (s[i] == '1') { return Sub2(i + 1, cur, md2 ^ 1) + Sub2(i + 1, cur ^ (1 << i), md2); } return Sub2(i + 1, cur ^ ((s[i] == '?') << i), md2); } int Sub3(int i, int cur, bool md2) { if (i >= l) { return Pre2[cur] * po[md2]; } if (s[i] == '0') { return Sub3(i + 1, cur, md2) + Sub3(i + 1, cur ^ (1 << i), md2 ^ 1); } return Sub3(i + 1, cur ^ ((s[i] == '1') << i), md2); } void Exc() { for (int x = 0; x < (1 << l); x++) { Pre1[x] = arr[x]; Pre2[x] = arr[((1 << l) - 1) ^ x]; } for (int x = 0; x < l; x++) { for (int mask = 0; mask < (1 << l); mask++) { if (mask & (1 << x)) { Pre1[mask] += Pre1[mask ^ (1 << x)]; Pre2[mask] += Pre2[mask ^ (1 << x)]; } } } for (int x = 0; x < (1 << l); x++) { int y = ((1 << l) - 1) ^ x; if (y > x) { swap(Pre2[x], Pre2[y]); } } for (int x = 1; x <= q; x++) { cin >> s; reverse(s.begin(), s.end()); int cnt0 = 0, cnt1 = 0, cnt = 0; for (char y : s) { if (y == '?') { cnt++; } else if (y == '0') { cnt0++; } else { cnt1++; } } if (cnt <= min(cnt0, cnt1)) { cout << Sub1(0, 0) << "\n"; } else if (cnt1 <= min(cnt0, cnt)) { cout << Sub2(0, 0, 0) << "\n"; } else { cout << Sub3(0, 0, 0) << "\n"; } } } int main() { //freopen("D.INP", "r", stdin); //freopen("D.OUT", "w", stdout); ios_base::sync_with_stdio(false); cin.tie(nullptr); int test = 1; //cin >> test; for (int x = 1; x <= test; x++) { Inp(); Exc(); } 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...