| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1306003 | dobri_oke | Snake Escaping (JOI18_snake_escaping) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
#define F first
#define S second
const int N = (1 << 20) + 5, inf = 1e9 + 1, mod = 1e9 + 7;
int n, q, dp[N], c[N];
string s;
void solve(){
cin >> n >> q >> s;
for(int i = 0; i < (1 << n); i++){
c[i] = s[i] - '0';
dp[i] = c[i];
}
for(int i = 0; i < n; i++){
for(int mask = 0; mask < (1 << n); mask++){
if(((mask >> i) & 1) == 0){
dp[mask] += dp[(mask | (1 << i))];
}
}
}
while(q--){
string d;
cin >> d;
int g = 0, h = 0, f = 0, cnt = 0, cnt2 = 0, sum = 0;
for(int i = 0; i < n; i++){
if(d[n - i - 1] == '1') g += (1 << i);
else if(d[n - i - 1] == '0'){ h += (1 << i); cnt++;}
else{ f += (1 << i); cnt2++;}
}
if(cnt < cnt2){
for(int mask = h; ; mask = ((mask - 1) & h)){
int i = __builtin_popcaount(mask);
if(i % 2 == 1) sum -= dp[(g | mask)];
else sum += dp[(g | mask)];
if(mask == 0) break;
}
}
else{
for(int mask = f; ; mask = ((mask - 1) & f)){
sum += c[(g | mask)];
if(mask == 0) break;
}
}
cout << sum << '\n';
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
//freopen("guard.in", "r", stdin);
//freopen("guard.out", "w", stdout);
int tt = 1;
//cin >> tt;
while(tt--) solve();
}
