Submission #1366372

#TimeUsernameProblemLanguageResultExecution timeMemory
1366372nguyenkhangninh99Snake Escaping (JOI18_snake_escaping)C++20
100 / 100
392 ms20684 KiB
#include <bits/stdc++.h>
using namespace std;

int val[1 << 20], f[1 << 20], g[1 << 20];
void solve(){
    int n, q; cin >> n >> q;

    for(int i = 0; i < (1 << n); i++){
        char c; cin >> c;
        f[i] = g[i] = val[i] = (c - '0');
    }
    for(int i = 0; i < n; i++){
        for(int mask = 0; mask < (1 << n); mask++){
            if(mask & (1 << i)) f[mask] += f[mask ^ (1 << i)];
            else g[mask] += g[mask ^ (1 << i)];
        }
    }

    while(q--){
        string s; cin >> s;
        reverse(s.begin(), s.end());

        int cnta = 0, cntb = 0, cntc = 0, A = 0, B = 0, C = 0;
        for(int i = 0; i < n; i++){
            if(s[i] == '0'){
                cnta++;
                A |= (1 << i);
            }else if(s[i] == '1'){
                cntb++;
                B |= (1 << i);
            }else{
                cntc++;
                C |= (1 << i);
            }
        }

        int res = 0;
        if(cnta <= min(cntb, cntc)){
            for(int sub = A; 1; sub = (sub - 1) & A){
                res += g[sub | B] * (__builtin_popcount(sub) % 2 ? -1: 1);
                if(sub == 0) break;
            }
        }else if(cntb <= min(cnta, cntc)){
            for(int sub = B; 1; sub = (sub - 1) & B){
                res += f[sub | C] * (__builtin_popcount(B) % 2 == __builtin_popcount(sub) % 2 ? 1 : -1);
                if(sub == 0) break;
            }
        }else{
            for(int sub = C; 1; sub = (sub - 1) & C){
                res += val[sub | B];
                if(sub == 0) break;
            }
        }
        cout << res << "\n";
    }
}

signed main(){
    ios_base::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);

    solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...