Submission #1237666

#TimeUsernameProblemLanguageResultExecution timeMemory
1237666dwuySnake Escaping (JOI18_snake_escaping)C++17
75 / 100
2090 ms31504 KiB
/** - dwuy -       />  フ       |  _  _|       /`ミ _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" #define int long long 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]; // 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 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}; for(char &c: s){ if(c == '0') b[0]++; if(c == '1') b[1]++; if(c == '?') b[2]++; } int x = 0, ans = 0; int mn = min({b[0], b[1], b[2]}); if(mn == b[0]){ for(char c: s) x = (x << 1) | (c == '1'); reverse(s.begin(), s.end()); for(int mask=0; mask<MASK(b[0]); mask++){ int e = mask; int y = x; for(int i=0; i<n; i++) if(s[i] == '0'){ if(e&1) y |= MASK(i); e>>=1; } ans += __builtin_popcount(mask)&1 ? -rf[y] : rf[y]; } } else if(mn == b[1]){ for(char c: s) x = (x << 1) | (c != '0'); reverse(s.begin(), s.end()); for(int mask=0; mask<MASK(b[1]); mask++){ int e = mask; int y = x; for(int i=0; i<n; i++) if(s[i] == '1'){ if(e&1) y ^= MASK(i); e >>= 1; } ans += __builtin_popcount(mask)&1 ? -f[y] : f[y]; } } else{ for(char c: s) x = (x << 1) | (c == '1'); reverse(s.begin(), s.end()); for(int mask=0; mask<MASK(b[2]); mask++){ int e = mask; int y = x; for(int i=0; i<n; i++) if(s[i] == '?'){ if(e&1) y |= MASK(i); e >>= 1; } ans += a[y]; } } 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...