#include <bits/stdc++.h>
using namespace std;
map<string, int> m, rr;
struct func {
  string name;
  int z[6], ct;
} p[1005], tt;
string str;
int a, b, c;
void delfs(string &k) {
  int l = k.size(), p = 0;
  for (p = 0; p < l; p++)
    if (!(k[p] == ' ' || k[p] == '(' || k[p] == ')' || k[p] == ',')) break;
  k.erase(0, p);
}
string firstw(string k) {
  int l = k.size(), i;
  for (i = 0; i < l; i++)
    if (k[i] != ' ' && k[i] != '(' && k[i] != ')' && k[i] != ',') {
      k.erase(0, i);
      break;
    }
  l = k.size();
  for (i = 0; i < l; i++)
    if (k[i] == ' ' || k[i] == '(' || k[i] == ')' || k[i] == ',')
      return k.substr(0, i);
  return k;
}
int main() {
  rr["T"] = 1;
  rr["int"] = 2;
  rr["string"] = 3;
  rr["double"] = 4;
  cin >> a;
  getline(cin, str);
  for (int i = 1; i <= a; i++) {
    getline(cin, str);
    delfs(str);
    str.erase(0, 4);
    delfs(str);
    string tmp = firstw(str);
    p[i].name = str.substr(0, tmp.size());
    str.erase(0, tmp.size());
    delfs(str);
    while (str.size() != 0) {
      if (str[0] == 'T')
        p[i].z[++p[i].ct] = 1, str.erase(0, 1);
      else if (str.substr(0, 3) == "int")
        p[i].z[++p[i].ct] = 2, str.erase(0, 3);
      else if (str.substr(0, 6) == "string")
        p[i].z[++p[i].ct] = 3, str.erase(0, 6);
      else if (str.substr(0, 6) == "double")
        p[i].z[++p[i].ct] = 4, str.erase(0, 6);
      delfs(str);
    }
  }
  cin >> b;
  getline(cin, str);
  for (int i = 1; i <= b; i++) {
    getline(cin, str);
    delfs(str);
    string tmp = firstw(str);
    str.erase(0, tmp.size());
    delfs(str);
    string t2 = firstw(str);
    m[t2] = rr[tmp];
  }
  cin >> c;
  getline(cin, str);
  for (int i = 1; i <= c; i++) {
    int ans = 0;
    tt.ct = 0;
    getline(cin, str);
    delfs(str);
    string fname = firstw(str);
    tt.name = fname;
    str.erase(0, fname.size());
    delfs(str);
    while (str.size() != 0) {
      string nx = firstw(str);
      tt.z[++tt.ct] = m[nx];
      str.erase(0, nx.size());
      delfs(str);
    }
    for (int j = 1; j <= a; j++) {
      if (tt.ct != p[j].ct || tt.name != p[j].name) continue;
      bool flg = 0;
      for (int k = 1; k <= tt.ct; k++)
        if (tt.z[k] != p[j].z[k])
          if (p[j].z[k] != 1) {
            flg = 1;
            break;
          }
      if (flg) {
        flg = 0;
        continue;
      }
      ans++;
    }
    cout << ans << endl;
    for (int j = 1; j <= 5; j++) tt.z[j] = 0;
  }
  return 0;
}
