#include <bits/stdc++.h>
using namespace std;
char line[500];
struct proc {
  vector<string> pname;
  string name;
};
map<string, string> v;
vector<proc> pr;
vector<string> calls[1007];
string T = string("T");
bool match(proc p, int poz) {
  if (p.name != calls[poz][0] || p.pname.size() != (calls[poz].size() - 1))
    return false;
  int i;
  for (i = 0; i < p.pname.size(); i++)
    if (v[calls[poz][i + 1]] != p.pname[i] && p.pname[i] != T) return false;
  return true;
}
int ans[1007];
int main() {
  char sep[] = ", ()";
  int i, n, m, nr;
  char *st;
  proc aux;
  string s, s1;
  cin.get(line, 500, '\n');
  cin.get();
  n = 0;
  for (i = 0; i < strlen(line); i++) n = n * 10 + (line[i] - '0');
  for (i = 1; i <= n; i++) {
    cin.get(line, 500, '\n');
    cin.get();
    st = strtok(line, sep);
    st = strtok(0, sep);
    aux.name = string(st);
    aux.pname.clear();
    for (st = strtok(0, sep); st != NULL; st = strtok(0, sep))
      aux.pname.push_back(string(st));
    pr.push_back(aux);
  }
  cin.get(line, 500, '\n');
  cin.get();
  for (i = 0, m = 0; i < strlen(line); i++) m = m * 10 + (line[i] - '0');
  for (i = 1; i <= m; i++) {
    cin.get(line, 500, '\n');
    cin.get();
    st = strtok(line, sep);
    s = string(st);
    st = strtok(0, sep);
    s1 = string(st);
    v.insert(make_pair(s1, s));
  }
  cin.get(line, 500, '\n');
  cin.get();
  for (i = 0, nr = 0; i < strlen(line); i++) nr = nr * 10 + (line[i] - '0');
  for (i = 1; i <= nr; i++) {
    cin.get(line, 500, '\n');
    cin.get();
    for (st = strtok(line, sep); st != NULL; st = strtok(0, sep))
      calls[i].push_back(string(st));
  }
  int j;
  for (i = 1; i <= nr; i++) {
    for (j = 0; j < n; j++) {
      if (match(pr[j], i)) ans[i]++;
    }
  }
  for (i = 1; i <= nr; i++) cout << ans[i] << '\n';
  return 0;
}
