Submission #1256947

#TimeUsernameProblemLanguageResultExecution timeMemory
1256947tvgkSnake Escaping (JOI18_snake_escaping)C++20
100 / 100
1096 ms17596 KiB
#include<bits/stdc++.h> using namespace std; #define task "a" #define se second #define fi first #define ll long long #define ii pair<ll, ll> const long mxN = 3e6 + 7; int n, q, dp[mxN][2]; string s; char chr[3] = {'0', '1', '?'}; vector<int> vc[3]; bool Check_bit(int j, int i) { return (j >> i) & 1; } int BackTrack2(int j, int sum, vector<int>& v) { if (j == v.size()) return s[sum] - '0'; int res = 0; for (int i = 0; i <= 1; i++) res += BackTrack2(j + 1, sum + (i << v[j]), v); return res; } int BackTrack1(int j, int sum, bool cnt, int id) { if (j == vc[id].size()) { if (!cnt) return dp[sum][id ^ 1]; else return -dp[sum][id ^ 1]; } int res = 0; for (int i = 0; i <= 1; i++) { if (id) res += BackTrack1(j + 1, sum - (i << vc[id][j]), cnt ^ i, id); else res += BackTrack1(j + 1, sum + (i << vc[id][j]), cnt ^ i, id); } return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen(task".INP", "r", stdin); //freopen(task".OUT", "w", stdout); cin >> n >> q; cin >> s; for (int id = 0; id <= 1; id++) { for (int i = 0; i < (1 << n); i++) dp[i][id] = s[i] - '0'; for (int u = 0; u < n; u++) { for (int i = 0; i < (1 << n); i++) { if (Check_bit(i, u) == id) dp[i ^ (1 << u)][id] += dp[i][id]; } } } for (int i = 1; i <= q; i++) { string t; cin >> t; reverse(t.begin(), t.end()); for (int u = 0; u < 3; u++) vc[u].clear(); for (int j = 0; j < t.size(); j++) { for (int u = 0; u < 3; u++) { if (chr[u] == t[j]) vc[u].push_back(j); } } if (vc[2].size() <= n / 3) { int sum = 0; for (int i = 0; i < t.size(); i++) { if (t[i] != '?') sum += (t[i] - '0') << i; } cout << BackTrack2(0, sum, vc[2]) << '\n'; } else { bool id = vc[0].size() < vc[1].size(); int sum = 0; for (int i = 0; i < t.size(); i++) { if (t[i] != id + '0') sum += (id ^ 1) << i; else sum += id << i; } cout << BackTrack1(0, sum, 0, id ^ 1) << '\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...