Submission #1305968

#TimeUsernameProblemLanguageResultExecution timeMemory
1305968tntSnake Escaping (JOI18_snake_escaping)C++20
0 / 100
1 ms508 KiB
#include <bits/stdc++.h> using namespace std; //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") //#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3") #define pb push_back #define ll long long #define sz(v) int(v.size()) #define all(v) v.begin(),v.end() int mod = 1e9 + 7; const int N = 1048576 + 100; const ll inf = 2e18; int dp[N],dp1[N]; void solve(){ int l,q; cin >> l >> q; int n = (1 << l); string s,t; cin >> s; for(int i = 0; i < n; i++) dp[i] = dp1[i] = s[i] - '0'; for(int i = 0; i < l; i++){ for(int mask = (1 << n) - 1; mask>= 0; mask--){ if((mask >> i & 1) == 0){ dp[mask] += dp[(mask | (1 << i))]; } } } for(int i = 0; i < l; i++){ for(int mask = 0; mask < (1 << n); mask++){ if((mask >> i & 1) == 1){ dp1[mask] += dp1[(mask ^ (1 << i))]; } } } while(q--){ cin >> t; int cnt = 0,cnt1 = 0; for(int i = 0; i < l; i++){ if(t[i] == '1') cnt++; else if(t[i] != '0') cnt1++; } if(cnt1 <= 6){ vector <int> v; int cur = 0,mask = 0; for(int i = l - 1; i >= 0; i--){ if(t[i] == '?') v.pb(cur); else mask += (1 << cur) * (t[i] == '1'); cur++; } int sum = 0; for(int mask1 = 0; mask1 < (1 << sz(v)); mask1++){ int mask2 = mask; for(int i = 0; i < sz(v); i++){ if((mask1 >> i & 1) == 1) mask2 |= (1 << v[i]); } sum += s[mask2] - '0'; } cout << sum << '\n'; } else if(cnt > 6){ vector <int> v; int cur = 0,mask = 0; for(int i = l - 1; i >= 0; i--){ if(t[i] == '0') v.pb(cur); else if(t[i] == '1') mask += (1 << cur); cur++; } int sum = 0; for(int mask1 = 0; mask1 < (1 << sz(v)); mask1++){ int mask2 = mask; for(int i = 0; i < sz(v); i++){ if((mask1 >> i & 1) == 1) mask2 |= (1 << v[i]); } if(__builtin_popcount(mask1) % 2) sum -= dp[mask2]; else sum += dp[mask2]; } cout << sum << '\n'; } else{ vector <int> v; int cur = 0,mask = 0; for(int i = l - 1; i >= 0; i--){ if(t[i] == '1') mask += (1 << cur),v.pb(cur); else if(t[i] == '?')mask += (1 << cur); cur++; } int sum = 0; for(int mask1 = 0; mask1 < (1 << sz(v)); mask1++){ int mask2 = mask; for(int i = 0; i < sz(v); i++){ if((mask1 >> i & 1) == 1) mask2 -= (1 << v[i]); } if(__builtin_popcount(mask1) % 2) sum -= dp1[mask2]; else sum += dp1[mask2]; } cout << sum << '\n'; } } } signed main(){ //freopen("time.in", "r", stdin); //freopen("time.out", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); int t1 = 1; while(t1--){ solve(); } }
#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...