#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[(1<<20)];
int f[(1<<20)], g[(1<<20)];
signed main(){
	int l, q;
	cin >> l >> q;
	string s;
	cin >> s;
	for (int i = 0;i<s.size();++i){
		a[i] = s[i]-'0';
		f[i] = a[i];
		g[i] = a[i];
	}
	int maxn = (1<<l);
	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)];
			}
		}
	}
	// cout << g[0];return 0;
	while(q--){
		string t;
		cin >> t;
		reverse(t.begin(), t.end());
		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);
		}
		int res = 0;
		if(__builtin_popcount(C)<=(l/3)){
			// cout << "NGU ";
			int s = C;
			while(s>0){
				res += a[B|s];
				s = (s-1)&C;
			}
			res += a[B];
		}else if(__builtin_popcount(A)<=(l/3)){
			// cout << "LON ";
			int s = A;
			while(s>0){
				// cout << s << ' ';
				if(__builtin_popcount(s)%2==0){
					res += g[B|s];
				}else res-=g[B|s];
				s = (s-1)&A;
			}
			res += g[B];
		}else{
			// cout << "CAC ";
			int s = B;
			while(s>0){
				if(__builtin_popcount(s)%2==0){
					res += f[C|s];
				}else res-= f[C|s];
				s = (s-1)&B;
			}
			res += f[C];
		}
		cout << res << '\n';
	}
}
| # | 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... |