#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();
}