Submission #771468

#TimeUsernameProblemLanguageResultExecution timeMemory
771468vjudge1Snake Escaping (JOI18_snake_escaping)C++17
100 / 100
1454 ms39268 KiB
// #cheat_when_I_was_young // #cheatkhitacontre #khionhatoicheat // #thaycuckythatvong #include "bits/stdc++.h" using namespace std; #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) //#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") const int N = 1<<20; int n, q, dp[N], sup[N]; string s, t; int backtrack1(int idx, int num) { if (idx == n) return s[num]; if (t[idx] == '0') return backtrack1(idx+1, num); if (t[idx] == '1') return backtrack1(idx+1, num | (1<<idx)); return backtrack1(idx+1, num) + backtrack1(idx+1, num | (1<<idx)); } int backtrack2(int idx, int num, int change) { if (idx == n) { if (change % 2) return -dp[num]; return dp[num]; } if (t[idx] == '0') return backtrack2(idx+1, num, change); if (t[idx] == '?') return backtrack2(idx+1, num | (1<<idx), change); return backtrack2(idx+1, num, change+1) + backtrack2(idx+1, num | (1<<idx), change); } int backtrack3(int idx, int num, int change) { if (idx == n) { if (change % 2) return -sup[num]; return sup[num]; } if (t[idx] == '1') return backtrack3(idx+1, num | (1<<idx), change); if (t[idx] == '?') return backtrack3(idx+1, num, change); return backtrack3(idx+1, num, change) + backtrack3(idx+1, num | (1<<idx), change+1); } signed main() { IOS; cin >> n >> q >> s; for (int mask = 0; mask < 1<<n; ++mask) { s[mask] -= '0'; dp[mask] = sup[mask] = s[mask]; } for (int i = n-1; i >= 0; --i) for (int mask = 0; mask < 1<<n; ++mask) if (mask & (1<<i)) dp[mask] += dp[mask^(1<<i)]; for (int i = n-1; i >= 0; --i) for (int mask = (1<<n)-1; mask >= 0; --mask) if (!(mask & (1<<i))) sup[mask] += sup[mask^(1<<i)]; while (q--) { cin >> t; reverse(t.begin(), t.end()); int cnt[] = {0, 0, 0}; for (char &c: t) { if (c == '0') ++cnt[0]; else if (c == '1') ++cnt[1]; else ++cnt[2]; } int mi = *min_element(cnt, cnt+3); if (cnt[2] == mi) cout << backtrack1(0, 0) << "\n"; else if (cnt[1] == mi) cout << backtrack2(0, 0, 0) << "\n"; else cout << backtrack3(0, 0, 0) << "\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...