Submission #1271370

#TimeUsernameProblemLanguageResultExecution timeMemory
1271370VMaksimoski008Snake Escaping (JOI18_snake_escaping)C++20
12 / 100
2096 ms12744 KiB
#include <bits/stdc++.h> #define ar array //#define int long long using namespace std; using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int mod = 1e9 + 7; const ll inf = 1e18; const int N = 1e5 + 5; signed main() { ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0); int n, q; cin >> n >> q; vector<int> a(1<<n); for(int i=0; i<(1<<n); i++) { char ch; cin >> ch; a[i] = ch - '0'; } auto get_val = [&](const string &s) { int p = 0; for(int i=0; i<n; i++) if(s[i] == '1') p |= (1 << (n-i-1)); return p; }; vector<int> dp_up(1<<n), dp_down(1<<n); for(int s=0; s<(1<<n); s++) { for(int s2=s; s2; s2=(s2-1)&s) { dp_up[s2] += a[s]; // dp_down[s] += a[s2]; } dp_up[0] += a[s]; // dp_down[s] += a[0]; } for(int i=0; i<(1<<n); i++) dp_down[i] = a[i]; for(int i=0; i<n; i++) for(int s=0; s<(1<<n); s++) if(s & (1 << i)) dp_down[s] += dp_down[s^(1<<i)]; while(q--) { string s; cin >> s; map<char, int> mp; for(char ch : s) mp[ch]++; // if(mp['?'] == 0) { // cout << a[get_val(s)] << '\n'; // continue; // } // if(mp['?'] <= 6) { // int og = get_val(s); // vector<int> pos; // for(int i=0; i<n; i++) // if(s[i] == '?') pos.push_back(n-i-1); // int m = pos.size(), ans = 0; // for(int mask=0; mask<(1<<m); mask++) { // int v = og; // for(int i=0; i<m; i++) // if(mask & (1 << i)) // v += (1 << pos[i]); // ans += a[v]; // } // cout << ans << '\n'; // continue; // } // if(mp['0'] <= 6) { // int ans = 0, og = get_val(s); // vector<int> pos; // for(int i=0; i<n; i++) // if(s[i] == '0') pos.push_back(n-i-1); // int m = pos.size(); // for(int mask=0; mask<(1<<m); mask++) { // int v = og; // for(int i=0; i<m; i++) // if(mask & (1 << i)) v |= (1 << pos[i]); // if(__builtin_parity(mask)) ans -= dp_up[v]; // else ans += dp_up[v]; // } // cout << ans << '\n'; // continue; // } int ans = 0, og = get_val(s); vector<int> pos; for(int i=0; i<n; i++) { if(s[i] == '1') pos.push_back(n-i-1); else if(s[i] == '?') og |= (1 << (n-i-1)); } int m = pos.size(); for(int mask=0; mask<(1<<m); mask++) { int v = og; for(int i=0; i<m; i++) if(mask & (1 << i)) v -= (1 << pos[i]); if(__builtin_parity(mask)) ans -= dp_down[v]; else ans += dp_down[v]; } cout << ans << '\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...