Submission #771463

#TimeUsernameProblemLanguageResultExecution timeMemory
771463vjudge1Snake Escaping (JOI18_snake_escaping)C++17
22 / 100
949 ms65536 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, M = 21; int n, q, dp[N][M], sup[N][M]; 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][0]; return dp[num][0]; } 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][0]; return sup[num][0]; } 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][n] = sup[mask][n] = s[mask]; } for (int mask = 0; mask < 1<<n; ++mask) for (int i = n-1; i >= 0; --i) { dp[mask][i] = dp[mask][i+1]; if (mask & (1<<i)) dp[mask][i] += dp[mask^(1<<i)][i+1]; } for (int mask = (1<<n)-1; mask >= 0; --mask) for (int i = n-1; i >= 0; --i) { sup[mask][i] = sup[mask][i+1]; if (!(mask & (1<<i))) sup[mask][i] += sup[mask^(1<<i)][i+1]; } 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]; } if (cnt[2] <= 6) cout << backtrack1(0, 0) << "\n"; else if (cnt[1] <= 6) 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...