#include <bits/stdc++.h>
using namespace std;
int c[1 << 12];
long long int ways[1 << 24];
char s[12];
long long int doDFS(int c, int m, int m2) {
  if (c == 12) return ways[(m << 12) | m2];
  if (s[c] == 'A')
    return doDFS(c + 1, m, m2) + doDFS(c + 1, m ^ (1 << c), m2);
  else if (s[c] == 'O')
    return doDFS(c + 1, m, m2);
  else if (s[c] == 'X')
    return doDFS(c + 1, m, m2) + doDFS(c + 1, m, m2 ^ (1 << c));
  else if (s[c] == 'a')
    return doDFS(c + 1, m, m2 ^ (1 << c));
  else if (s[c] == 'o')
    return doDFS(c + 1, m ^ (1 << c), m2) + doDFS(c + 1, m, m2 ^ (1 << c));
  else
    return doDFS(c + 1, m ^ (1 << c), m2);
}
int main() {
  int i, j;
  int w, n, m, a;
  scanf("%d %d %d", &w, &n, &m);
  for (i = 0; i < n; i++) scanf("%d", &a), c[a]++;
  for (i = 0; i < (1 << 12); i++) {
    for (j = 0; j < (1 << 12); j++)
      ways[((i ^ j) << 12) | (i & j)] += (long long int)c[i] * c[j];
  }
  for (i = 0; i < m; i++) {
    vector<int> v;
    for (j = 0; j < w; j++) scanf(" %c", &s[j]);
    reverse(s, s + w);
    for (j = w; j < 12; j++) s[j] = 'O';
    printf("%I64d\n", doDFS(0, 0, 0));
  }
  return 0;
}
