#include <bits/stdc++.h>
using namespace std;
int trie[5000010][5];
int vis[5000010];
char s[55], str[55];
int tot = 0;
map<int, int> mp;
void insert() {
  int len = strlen(s);
  int root = 0;
  for (int i = 0; i < len; i++) {
    int id = s[i] - 'a';
    if (trie[root][id] == 0) trie[root][id] = ++tot;
    root = trie[root][id];
  }
  vis[root]++;
}
int find(int len) {
  int root = 0;
  for (int i = 0; i < len; i++) {
    int id = s[i] - 'a';
    if (trie[root][id] == 0) return 0;
    root = trie[root][id];
  }
  if (vis[root]) return root;
  return 0;
}
void dfs(int l1, int l2, int top) {
  while (l1 < top && str[l1] != '?') s[l2++] = str[l1++];
  if (l1 >= top) {
    int tt = find(l2);
    if (tt) {
      mp[tt] += vis[tt];
      vis[tt] = 0;
    }
    return;
  }
  for (int i = 0; i < 6; i++) {
    if (i == 5)
      dfs(l1 + 1, l2, top);
    else {
      s[l2] = 'a' + i;
      dfs(l1 + 1, l2 + 1, top);
    }
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%s", s);
    insert();
  }
  while (m--) {
    mp.clear();
    scanf("%s", str);
    int len = strlen(str);
    dfs(0, 0, len);
    int ans = 0;
    for (auto i : mp) {
      ans += i.second;
      vis[i.first] += i.second;
    }
    printf("%d\n", ans);
  }
  return 0;
}
