#include <iostream>
#include <vector>
#include <string>
using namespace std;
int L, Q;
int toxicity[1 << 20];
int sub_sum[1 << 20];
int super_sum[1 << 20];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> L >> Q;
string S;
cin >> S;
for (int i = 0; i < (1 << L); i++) {
toxicity[i] = S[i] - '0';
sub_sum[i] = toxicity[i];
super_sum[i] = toxicity[i];
}
// SOS DP (Sum Over Subsets) - qism to'plamlar yig'indisi uchun
for (int i = 0; i < L; i++) {
for (int mask = 0; mask < (1 << L); mask++) {
if (mask & (1 << i)) {
sub_sum[mask] += sub_sum[mask ^ (1 << i)];
}
}
}
// Sum Over Supersets - ust-to'plamlar yig'indisi uchun
for (int i = 0; i < L; i++) {
for (int mask = (1 << L) - 1; mask >= 0; mask--) {
if (!(mask & (1 << i))) {
super_sum[mask] += super_sum[mask ^ (1 << i)];
}
}
}
while (Q--) {
string T;
cin >> T;
int mask0 = 0, mask1 = 0, maskQ = 0;
int q_count = 0, zero_count = 0, one_count = 0;
for (int i = 0; i < L; i++) {
int bit = L - 1 - i;
if (T[i] == '0') {
zero_count++;
} else if (T[i] == '1') {
mask1 |= (1 << bit);
one_count++;
} else {
maskQ |= (1 << bit);
q_count++;
}
}
long long ans = 0;
if (q_count <= 6) {
// '?' belgilari kam bo'lsa, barcha variantlarni tekshiramiz
for (int m = maskQ; ; m = (m - 1) & maskQ) {
ans += toxicity[mask1 | m];
if (m == 0) break;
}
} else if (one_count <= 6) {
// '1' belgilari kam bo'lsa, Inclusion-Exclusion (Kiritish-chiqarish) prinsipi
for (int m = mask1; ; m = (m - 1) & mask1) {
if (__builtin_popcount(mask1 ^ m) % 2 == 1) {
ans -= sub_sum[maskQ | m];
} else {
ans += sub_sum[maskQ | m];
}
if (m == 0) break;
}
} else {
// '0' belgilari kam bo'lsa, Inclusion-Exclusion
int mask0_full = ((1 << L) - 1) ^ mask1 ^ maskQ;
for (int m = mask0_full; ; m = (m - 1) & mask0_full) {
if (__builtin_popcount(mask0_full ^ m) % 2 == 1) {
ans -= super_sum[mask1 | m];
} else {
ans += super_sum[mask1 | m];
}
if (m == 0) break;
}
}
cout << ans << "\n";
}
return 0;
}