Submission #1237687

#TimeUsernameProblemLanguageResultExecution timeMemory
1237687dwuySnake Escaping (JOI18_snake_escaping)C++17
100 / 100
498 ms29500 KiB
/** - lwuy -       />  フ       |  _  _|       /`ミ _x ノ      /      |     /  ヽ   ?  / ̄|   | | |  | ( ̄ヽ__ヽ_)_)  \二つ **/ #include <bits/stdc++.h> #define fastIO ios_base::sync_with_stdio(false); cin.tie(NULL) #define file(a) freopen(a".inp","r",stdin); freopen(a".out", "w",stdout) #define fi first #define se second #define endl "\n" #define len(s) (int)((s).size()) #define MASK(k)(1LL<<(k)) #define TASK "test" using namespace std; typedef tuple<int, int, int> tpiii; typedef pair<double, double> pdd; typedef pair<int, int> pii; typedef long long ll; const long long OO = 1e18; const int MOD = 1e9 + 7; const int INF = 1e9; const int MX = MASK(20); int n, q; string s; int a[MX]; int f[MX], rf[MX]; int cnt[MX]; // subset, superset; int32_t main(){ fastIO; //file(TASK); cin >> n >> q; cin >> s; for(int i=0; i<MASK(n); i++) a[i] = s[i] - '0'; for(int i=0; i<MASK(n); i++) f[i] = rf[i] = a[i]; for(int mask=1; mask<MASK(n); mask++) cnt[mask] = cnt[mask - (-mask & mask)] + 1; for(int i=0; i<n; i++){ for(int mask=0; mask<MASK(n); mask++){ mask |= MASK(i); f[mask] += f[mask ^ MASK(i)]; // subset rf[mask ^ MASK(i)] += rf[mask]; // superset } } while(q--){ string s; cin >> s; int b[3] = {0}; int c[3] = {0}; for(char &e: s){ for(int i=0; i<3; i++) c[i] <<= 1; if(e == '0') b[0]++, c[0]++; if(e == '1') b[1]++, c[1]++; if(e == '?') b[2]++, c[2]++; } int x = 0, ans = 0; int mn = min({b[0], b[1], b[2]}); for(char c: s) x = (x << 1) | (c == '1'); if(mn == b[0]){ for(int mask=c[0]; ;mask=(mask - 1)&c[0]){ int y = x ^ mask; ans += cnt[mask]&1 ? -rf[y] : rf[y]; if(mask == 0) break; } } else if(mn == b[1]){ for(int i=0; i<n; i++) if(s[i] == '?') x |= MASK(n - i - 1); for(int mask=c[1]; ;mask=(mask - 1)&c[1]){ int y = x ^ mask; ans += cnt[mask]&1 ? -f[y] : f[y]; if(mask == 0) break; } } else{ for(int mask=c[2]; ;mask=(mask - 1)&c[2]){ int y = x ^ mask; ans += a[y]; if(mask == 0) break; } } cout << ans << endl; } 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...