#include <bits/stdc++.h>
#define ll long long
#define ldb long double
#define endl '\n'
#define For(i,l,r) for(int i=l;i<=r;i++)
#define ForD(i,r,l) for(int i=r;i>=l;i--)
#define ff first
#define ss second
#define pb push_back
#define all(x) x.begin(),x.end()
#define sz(x) (signed)x.size()
#define unq(x) x.resize(unique(all(x))-x.begin())
#define F "TASK"
#define fio freopen(F".INP","r",stdin);freopen(F".OUT","w",stdout);
using namespace std;
int n,q,dp[(1<<20)],dp1[(1<<20)];
int a[1<<20];
int cal1(string &s) {
    int t=0,t1=0,ans=0;
    For(i,0,n-1)
        if(s[i]=='0') t+=1<<i;
        else if (s[i]=='1') t1+=1<<i;
    bool k=__builtin_popcount(t)&1;
    for(int i=t;i>0;i=(i-1)&t) {
        bool k1=__builtin_popcount(i)&1;
        if (k1^k) ans-=dp1[t1+t-i];
        else ans+=dp1[t1+t-i];
    }
    if (k) ans-=dp1[t1+t];
    else ans+=dp1[t1+t];
    return ans;
}
int cal2(string &s) {
    int t=0,t1=0,ans=0;
    For(i,0,n-1)
        if(s[i]=='1') t+=1<<i;
        else if (s[i]=='?') t1+=1<<i;
    bool k=__builtin_popcount(t)&1;
    for(int i=t;i>0;i=(i-1)&t) {
        bool k1=__builtin_popcount(i)&1;
        if (k1^k) ans-=dp[t1+i];
        else ans+=dp[t1+i];
    }
    if (k) ans-=dp[t1];
    else ans+=dp[t1];
    return ans;
}
int cal3(string &s) {
    int t=0,t1=0,ans=0;
    For(i,0,n-1)
        if (s[i]=='?') t+=1<<i;
        else if(s[i]=='1') t1+=1<<i;
    for(int i=t;i>0;i=(i-1)&t)
        ans+=a[t1+i];
    ans+=a[t1];
    return ans;
}
int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> q;
    For(i,0,(1<<n)-1) {
        char c;
        cin >> c;
        a[i]=c-'0';
        dp[i]=c-'0';
        dp1[i]=c-'0';
    }
    for(int i = 0;i < n; ++i)
        for(int mask = 0; mask < (1<<n); ++mask){
            if(mask & (1<<i))
                dp[mask] += dp[mask^(1<<i)];
            else dp1[mask] += dp1[mask^(1<<i)];
        }
    while(q--) {
        string s;
        cin >> s;
        reverse(all(s));
        int cnt1=0,cnt2=0,cnt3=0;
        for(auto c: s)
            if (c=='0') cnt1++;
            else if (c=='1') cnt2++;
            else cnt3++;
        int mi=min({cnt1,cnt2,cnt3});
        if(cnt1==mi) cout << cal1(s) << endl;
        else if (cnt2==mi) cout << cal2(s) << endl;
        else cout << cal3(s) << endl;
    }
    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... |