#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int K = 20;
const int N = 1<<K;
int tab[N];
int s1[N], s2[N];
void LiczDP(int n, int k)
{
    for(int i = 0; i < n; ++i)
        s1[i] = s2[i] = tab[i];
    for(int j = 0; j < k; ++j)
        for(int i = 0; i < n; ++i)
            if(((1<<j)&i) == 0) s1[i ^ (1<<j)] += s1[i];
    for(int j = 0; j < k; ++j)
        for(int i = n - 1; i >= 0; --i)
            if((1<<j)&i) s2[i ^ (1<<j)] += s2[i];
}
int AnsQ(int k, int val, vector<int> p)
{
    int m = (int)p.size(), ans = 0;
    for(int i = 0; i < (1<<m); ++i)
    {
        int cur = 0;
        for(int j = 0; j < m; ++j)
            if((1<<j)&i)
                cur += (1<<p[j]);
        ans += tab[val | cur];
    }
    return ans;
}
int Ans0(int k, int val, vector<int> p)
{
    ll ans = 0LL;
    int m = (int)p.size();
    for(int i = 0; i < (1<<m); ++i)
    {
        int cur = val;
        for(int j = 0; j < m; ++j)
            if((1<<j)&i)
                cur ^= (1<<p[j]);
        if(__builtin_popcount(cur) % 2 == 0)
            ans += s2[cur];
        else
            ans -= s2[cur];
    }
    if(ans < 0) ans *= -1LL;
    return ans;
}
int Ans1(int k, int val, vector<int> p)
{
    ll ans = 0LL;
    int m = (int)p.size();
    for(int i = 0; i < (1<<m); ++i)
    {
        int cur = val;
        for(int j = 0; j < m; ++j)
            if((1<<j)&i)
                cur ^= (1<<p[j]);
        if(__builtin_popcount(cur) % 2 == 0)
            ans += s1[cur];
        else
            ans -= s1[cur];
    }
    if(ans < 0) ans *= -1LL;
    return ans;
}
void Solve()
{
    int k, q, n;
    string s;
    cin >> k >> q;
    cin >> s;
    n = (1<<k);
    for(int i = 0; i < n; ++i)
        tab[i] = (s[i] - '0');
    LiczDP(n, k);
    for(int i = 1; i <= q; ++i)
    {
        int val = 0;
        vector<int> p0, p1, pq;
        cin >> s;
        reverse(s.begin(), s.end());
        for(int j = 0; j < k; ++j)
        {
            if(s[j] == '?') pq.pb(j);
            if(s[j] == '0') p0.pb(j);
            if(s[j] == '1')
            {
                p1.pb(j);
                val += (1<<j);
            }
        }
        int ans = 0LL;
        if((int)pq.size() <= min((int)p1.size(), (int)p0.size()))
            ans = AnsQ(k, val, pq);
        else if((int)p0.size() <= (int)p1.size())
            ans = Ans0(k, val, p0);
        else
        {
            for(int j = 0; j < (int)pq.size(); ++j)
                val += (1<<pq[j]);
            ans = Ans1(k, val, p1);
        }
        cout << ans << "\n";
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //int t; cin >> t;
    //while(t--)
        Solve();
    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... |