#include <bits/stdc++.h>
#include <climits>
using namespace std;
#define f first
#define s second
#define all(a) a.begin(),a.end()
#define sz(a) (int)a.size()
using ll=long long;
int l,q;
string s;
const int N=(1<<20)+5;
int dp_super[N],dp_sub[N];
void solve(){
cin>>l>>q>>s;
for(int i=0;i<(1<<l);++i){
dp_super[i]=dp_sub[i]=s[i]-'0';
}
for(int i=0;i<l;++i){
for(int mask=0;mask<(1<<l);++mask){
if(mask&(1<<i)) dp_sub[mask]+=dp_sub[mask^(1<<i)];
else dp_super[mask]+=dp_super[mask^(1<<i)];
}
}
while(q--){
string in;cin>>in;
int base=0;
int cntquest=0,cnt0=0,cnt1=0;
reverse(all(in));
for(char i:in){
if(i=='?'){
++cntquest;
}
else if(i=='0') cnt0++;
else ++cnt1;
}
int ans=0;
int mi=min({cnt0,cnt1,cntquest});
if(cntquest==mi){
vector<int>pos;
for(int i=0;i<sz(in);++i){
if(in[i]=='?') pos.push_back(i);
if(in[i]=='1') base|=1<<i;
}
for(int mask=0;mask<(1<<cntquest);++mask){
int temp=base;
for(int i=0;i<cntquest;++i){
if(mask&(1<<i)) temp|=1<<pos[i];
}
ans+=s[temp]-'0';
}
}
else if(cnt1==mi){
vector<int>pos;
for(int i=0;i<sz(in);++i){
if(in[i]=='1'){
pos.push_back(i);
base|=1<<i;
}
if(in[i]=='?') base|=1<<i;
}
for(int mask=0;mask<(1<<cnt1);++mask){
int temp=base;
int cnt=0;
for(int i=0;i<cnt1;++i){
if(mask&(1<<i)) {
temp^=1<<pos[i];
++cnt;
}
}
if(cnt&1) ans-=dp_sub[temp];
else ans+=dp_sub[temp];
}
}
else{
vector<int>pos;
for(int i=0;i<sz(in);++i){
if(in[i]=='0'){
pos.push_back(i);
}
if(in[i]=='1') base|=1<<i;
}
for(int mask=0;mask<(1<<cnt0);++mask){
int temp=base;
int cnt=0;
for(int i=0;i<cnt0;++i){
if(mask&(1<<i)) {
temp^=1<<pos[i];
++cnt;
}
}
if(cnt&1) ans-=dp_super[temp];
else ans+=dp_super[temp];
}
}
cout<<ans<<'\n';
}
}
signed main(){
ios_base::sync_with_stdio(0);cin.tie(0);
solve();
}