#include <bits/stdc++.h>
using namespace std;
const int MAX = 540000;
int ar[1 << 12];
int dp[13][MAX];
int w;
vector<int> decode(int code) {
  vector<int> rt(w);
  for (int i = w - 1; i >= 0; i--) {
    rt[i] = code % 3;
    code /= 3;
  }
  return rt;
}
int encode(const vector<int>& info) {
  int rt = 0;
  for (int i = 0; i < (int)info.size(); i++) {
    rt = rt * 3 + info[i];
  }
  return rt;
}
int getBinary(const vector<int>& info) {
  int rt = 0;
  for (int i = 0; i < (int)info.size(); i++) {
    assert(info[i] < 3);
    rt = rt * 2 + info[i];
  }
  return rt;
}
int solve(int idx, vector<int> info) {
  int code = encode(info);
  if (idx == w) {
    return ar[getBinary(info)];
  }
  if (dp[idx][code] != -1) return dp[idx][code];
  if (info[idx] < 2) return dp[idx][code] = solve(idx + 1, info);
  info[idx] = 0;
  dp[idx][code] = solve(idx + 1, info);
  info[idx] = 1;
  dp[idx][code] += solve(idx + 1, info);
  return dp[idx][code];
}
ostream& operator<<(ostream& os, const vector<int>& v) {
  for (int i : v) {
    os << i << ',';
  }
  return os;
}
int gr, fck;
vector<int> vgray;
vector<int> vidx;
void grayCode(int i) {
  if (i == -1) {
    vgray.push_back(gr);
    vidx.push_back(fck);
    return;
  }
  grayCode(i - 1);
  gr ^= (1 << i);
  fck = i;
  grayCode(i - 1);
}
int p3[13];
int getInfoForZero(const string& s, vector<int>& info, vector<int>& flg,
                   int& code) {
  int i = 0;
  int rt = 0;
  code = 0;
  for (int j = 0; j < w; j++) {
    int v = i >> (w - 1 - j);
    v &= 1;
    if (s[j] == 'A') {
      if (v)
        info[j] = 0;
      else
        info[j] = 2;
      flg[j] = 0;
    } else if (s[j] == 'O') {
      if (v) {
        flg[j] = 1;
        rt++;
      } else {
        info[j] = 0;
        flg[j] = 0;
      }
    } else if (s[j] == 'X') {
      info[j] = v;
      flg[j] = 0;
    } else if (s[j] == 'a') {
      if (v == 0) {
        flg[j] = 1;
        rt++;
      } else {
        info[j] = 1;
        flg[j] = 0;
      }
    } else if (s[j] == 'o') {
      if (v)
        info[j] = 2;
      else
        info[j] = 1;
      flg[j] = 0;
    } else if (s[j] == 'x') {
      info[j] = v ^ 1;
      flg[j] = 0;
    } else {
      assert(false);
    }
    code += info[j] * p3[w - 1 - j];
  }
  return rt;
}
int changeIdx(int i, int j, int rt, const string& s, vector<int>& info,
              vector<int>& flg, int& code) {
  int v = i >> (w - 1 - j);
  v &= 1;
  if (flg[j]) {
    flg[j] = 0;
    rt--;
  }
  code -= info[j] * p3[w - 1 - j];
  if (s[j] == 'A') {
    if (v)
      info[j] = 0;
    else
      info[j] = 2;
    flg[j] = 0;
  } else if (s[j] == 'O') {
    if (v) {
      flg[j] = 1;
      rt++;
    } else {
      info[j] = 0;
      flg[j] = 0;
    }
  } else if (s[j] == 'X') {
    info[j] = v;
    flg[j] = 0;
  } else if (s[j] == 'a') {
    if (v == 0) {
      flg[j] = 1;
      rt++;
    } else {
      info[j] = 1;
      flg[j] = 0;
    }
  } else if (s[j] == 'o') {
    if (v)
      info[j] = 2;
    else
      info[j] = 1;
    flg[j] = 0;
  } else if (s[j] == 'x') {
    info[j] = v ^ 1;
    flg[j] = 0;
  } else {
    assert(false);
  }
  code += info[j] * p3[w - 1 - j];
  return rt;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> w >> n >> m;
  grayCode(w - 1);
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    ar[x]++;
    int xx = 0;
    for (int j = w - 1; j >= 0; j--) {
      xx *= 3;
      if (x & (1 << j)) xx++;
    }
    dp[w][xx]++;
  }
  n = 1 << w;
  int xx = 1;
  p3[0] = 1;
  for (int i = 0; i < w; i++) {
    xx *= 3;
    p3[i + 1] = xx;
  }
  for (int idx = w - 1; idx >= 0; idx--) {
    for (int code = 0; code < xx; code++) {
      vector<int> wt = decode(code);
      if (wt[idx] < 2)
        dp[idx][code] = dp[idx + 1][code];
      else {
        wt[idx] = 0;
        dp[idx][code] = dp[idx + 1][encode(wt)];
        wt[idx] = 1;
        dp[idx][code] += dp[idx + 1][encode(wt)];
      }
    }
  }
  while (m--) {
    string s;
    cin >> s;
    int ans = 0;
    vector<int> info(w);
    vector<int> flg(w);
    int code;
    int rt = getInfoForZero(s, info, flg, code);
    if (rt == 0) ans += dp[0][code] * ar[0];
    for (int i = 1; i < vgray.size(); i++) {
      int g = vgray[i];
      rt = changeIdx(g, w - 1 - vidx[i], rt, s, info, flg, code);
      if (rt == 0) ans += dp[0][code] * ar[g];
    }
    cout << ans << '\n';
  }
  return 0;
}
