#pragma GCC optimize("O3")
#include <bits/allocator.h>
#pragma GCC target("avx2")
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
void solve () {
int n, q; string s;
cin >> n >> q >> s;
vector<int> a(1 << n);
for (int i = 0; i < (1 << n); i++) {
a[i] = s[i] - '0';
}
auto copy_a = a;
auto b = a;
for (int j = 0; j < n; j++) {
for (int i = 0; i < (1 << n); i++) {
if (i >> j & 1) a[i] += a[i - (1 << j)];
}
}
for (int j = 0; j < n; j++) {
for (int i = 0; i < (1 << n); i++) {
if (i >> j & 1) b[i - (1 << j)] += b[i];
}
}
while (q--) {
string s;
cin >> s;
std::reverse(s.begin(), s.end());
int know = 0, mask = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
know += (1 << i);
} else if (s[i] == '?') {
mask += (1 << i);
}
}
int ans = 0;
if (__builtin_popcount(mask) <= 7) {
for (int msk = mask; ; msk = ((msk - 1) & mask)) {
ans += copy_a[msk | know];
if (msk == 0) break;
}
} else if (__builtin_popcount(know) <= 7) {
for (int msk = know; ; msk = ((msk - 1) & know)) {
if (__builtin_popcount(msk) % 2 == __builtin_popcount(know) % 2) {
ans += a[msk | mask];
} else {
ans -= a[msk | mask];
}
if (msk == 0) break;
}
} else {
int unknown = (1 << n) - 1 - know - mask;
for (int msk = unknown; ; msk = ((msk - 1) & unknown)) {
if (__builtin_popcount(msk) % 2 == 0) {
ans += b[msk | know];
} else {
ans -= b[msk | know];
}
if (msk == 0) break;
}
}
cout << ans << '\n';
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
}