#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[(1<<20)];
int f[(1<<20)], g[(1<<20)];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int l, q;
    if(!(cin >> l >> q)) return 0;
    string s;
    cin >> s;
    int maxn = (1<<l);
    for (int i = 0;i<maxn;++i){
        a[i] = s[i]-'0';
        f[i] = a[i];
        g[i] = a[i];
    }
    // SOS for subsets -> f[mask] = sum_{submask of mask} a[submask]
    for (int i = 0;i<l;++i){
        for (int j = 0;j<maxn;++j){
            if(j & (1<<i)) f[j] += f[j ^ (1<<i)];
            else g[j] += g[j | (1<<i)]; // g[mask] = sum_{superset of mask} a[superset]
        }
    }
    while(q--){
        string t;
        cin >> t;
        reverse(t.begin(), t.end()); // same as original
        int A = 0, B = 0, C = 0;
        for (int i = 0;i<l;++i){
            if(t[i]=='0') A |= (1<<i);
            else if(t[i]=='1') B |= (1<<i);
            else C |= (1<<i);
        }
        // pick smallest among A,B,C (by popcount) to enumerate
        int pcA = __builtin_popcountll(A);
        int pcB = __builtin_popcountll(B);
        int pcC = __builtin_popcountll(C);
        int res = 0;
        if(pcC <= pcA && pcC <= pcB){
            // enumerate submasks of C directly
            int mask = C;
            while(mask > 0){
                res += a[B | mask];
                mask = (mask - 1) & C;
            }
            res += a[B]; // mask = 0
        } else if(pcA <= pcB && pcA <= pcC){
            // inclusion-exclusion over A using g (superset sums)
            int mask = A;
            while(mask > 0){
                if(__builtin_popcountll(mask) % 2 == 0) res += g[B | mask];
                else res -= g[B | mask];
                mask = (mask - 1) & A;
            }
            res += g[B]; // mask = 0
        } else {
            // inclusion-exclusion over B using f (subset sums)
            // NOTE: signs fixed so that for B=0 we get +f[C]
            int mask = B;
            while(mask > 0){
                if(__builtin_popcountll(mask) % 2 == 0) res += f[C | mask];
                else res -= f[C | mask];
                mask = (mask - 1) & B;
            }
            res += f[C]; // mask = 0
        }
        cout << res << '\n';
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |