Submission #792475

#TimeUsernameProblemLanguageResultExecution timeMemory
792475CookieSnake Escaping (JOI18_snake_escaping)C++14
100 / 100
1049 ms43388 KiB
#include<bits/stdc++.h> #include<fstream> #pragma GCC optimize("Ofast,O3,unroll-loops") #pragma GCC target("avx2") using namespace std; //ifstream fin("FEEDING.INP"); //ofstream fout("FEEDING.OUT"); #define sz(a) (int)a.size() #define ll long long #define pb push_back #define forr(i, a, b) for(int i = a; i < b; i++) #define dorr(i, a, b) for(int i = a; i >= b; i--) #define ld long double #define vt vector #include<fstream> #define fi first #define se second #define pll pair<ll, ll> #define pii pair<int, int> const ll mxn = 3e5 + 5, base = 972663749; const ll mod = 911382323, mxv = 1e9 + 1, inf = 2e9; int l, q; int big[(1 << 21)], small[(1 << 21)], cnt[(1 << 20)]; string s; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> l >> q; cin >> s; for(int i = 0; i < (1 << l); i++){ cnt[i] = __builtin_popcount(i); big[i] = (s[i] - '0'); small[i] = (s[i] - '0'); } for(int i = 0; i < l; i++){ for(int j = 0; j < (1 << l); j++){ if(j & (1 << i))small[j] += small[j ^ (1 << i)]; else big[j] += big[j ^ (1 << i)]; } } while(q--){ char c; int zero = 0, one = 0, que = 0; for(int i = 0; i < l; i++){ cin >> c; if(c == '0')zero += (1 << (l - i - 1)); else if(c == '1')one += (1 << (l - i - 1)); else que += (1 << (l - i - 1)); } int ans = 0; if(__builtin_popcount(que) <= 6){ int mask = one; for(int j = que;j; j = (j - 1) & que){ //cout << (mask | j) << " "; ans += (s[mask | j] - '0'); } ans += (s[mask] - '0'); }else if(__builtin_popcount(one) <= 6){ int mask = que; for(int j = one;j; j = (j - 1) & one){ if((cnt[one] - cnt[j]) & 1)ans -= small[mask | j]; else ans += small[mask | j]; } if(cnt[one] & 1)ans -= small[mask]; else ans += small[mask]; }else{ int mask = one; for(int j = zero;j; j = (j - 1) & zero){ if(cnt[j] & 1)ans -= big[mask | j]; else ans += big[mask | j]; } ans += big[mask]; } cout << ans << "\n"; } 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...