#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")
using namespace std;
int a, b, c, d, n, m, k, w;
int cnt[1 << 12];
char str[14];
int mem[531441];
int p3[13];
int cur[12], no[12];
int gm[2][6];
inline int getnum(char ch) {
  switch (ch) {
    case 'A':
      return 0;
    case 'O':
      return 1;
    case 'X':
      return 2;
    case 'a':
      return 3;
    case 'o':
      return 4;
    case 'x':
      return 5;
    default:
      return -1;
  }
  return -1;
}
inline int ff(int func, int a, int b) {
  if (func == 0) return a & b;
  if (func == 1) return a | b;
  if (func == 2) return a ^ b;
  if (func == 3) return (a & b) ^ 1;
  if (func == 4) return (a | b) ^ 1;
  if (func == 5) return (a ^ b) ^ 1;
}
int main() {
  scanf("%d%d%d", &w, &n, &m);
  for (int _n((n)-1), i(0); i <= _n; i++) {
    scanf("%d", &a);
    ++cnt[a];
  }
  const int ov = 1 << w;
  int tot = 1;
  p3[0] = 1;
  for (int _n((w)-1), i(0); i <= _n; i++) {
    tot *= 3;
    p3[i + 1] = p3[i] * 3;
  }
  for (int _n((tot)-1), mask(0); mask <= _n; mask++) {
    int cm = 0;
    int t = mask;
    for (int _n((w)-1), j(0); j <= _n; j++) {
      int o = t % 3;
      t /= 3;
      if (o == 2) {
        mem[mask] = mem[mask - p3[j]] + mem[mask - p3[j] * 2];
        cm = -1;
        break;
      } else if (o == 1) {
        cm |= 1 << j;
      }
    }
    if (cm == -1) continue;
    mem[mask] += cnt[cm];
  }
  for (int _n((2) - 1), bit(0); bit <= _n; bit++) {
    for (int _n((6) - 1), func(0); func <= _n; func++) {
      int cc = 0;
      for (int _n((2) - 1), z(0); z <= _n; z++) {
        if (ff(func, bit, z) == 0) cc |= 1 << z;
      }
      gm[bit][func] = cc;
    }
  }
  for (int _n((m)-1), i(0); i <= _n; i++) {
    scanf("%s", str);
    reverse(str, str + w);
    for (int _n((w)-1), j(0); j <= _n; j++) {
      no[j] = getnum(str[j]);
    }
    int ans = 0;
    for (int _n((ov)-1), mask(0); mask <= _n; mask++) {
      if (!cnt[mask]) continue;
      int p = 0;
      for (int _n((w)-1), j(0); j <= _n; j++) {
        int o = gm[(mask >> j) & 1][no[j]];
        if (!o) {
          p = -1;
          break;
        }
        p += p3[j] * (o - 1);
      }
      if (p == -1) continue;
      ans += cnt[mask] * mem[p];
    }
    printf("%d\n", ans);
  }
}
