#include <bits/stdc++.h>
using namespace std;
struct funcion {
  string name;
  string vtype[5];
  int cantP;
  funcion() {}
  funcion(string pname, string pvtype1) {
    name = pname;
    vtype[0] = pvtype1;
  }
  funcion(string pname, string pvtype1, string pvtype2) {
    name = pname;
    vtype[0] = pvtype1;
    vtype[1] = pvtype2;
  }
  funcion(string pname, string pvtype1, string pvtype2, string pvtype3) {
    name = pname;
    vtype[0] = pvtype1;
    vtype[1] = pvtype2;
    vtype[2] = pvtype2;
  }
  funcion(string pname, string pvtype1, string pvtype2, string pvtype3,
          string pvtype4) {
    name = pname;
    vtype[0] = pvtype1;
    vtype[1] = pvtype2;
    vtype[2] = pvtype3;
    vtype[3] = pvtype4;
  }
  funcion(string pname, string pvtype1, string pvtype2, string pvtype3,
          string pvtype4, string pvtype5) {
    name = pname;
    vtype[0] = pvtype1;
    vtype[1] = pvtype2;
    vtype[2] = pvtype3;
    vtype[3] = pvtype4;
    vtype[4] = pvtype5;
  }
  bool operator<(const funcion b) const {
    if (name < b.name) return true;
    return false;
  }
} funciones[1010];
char line[1000], line1[10][100];
int f, v, c;
string ty, na;
map<string, string> variables;
int sol;
int main() {
  setvbuf(stdout, NULL, _IONBF, 0);
  scanf("%d\n", &f);
  for (int i = 0; i < f; ++i) {
    gets(line);
    int l = strlen(line);
    int param = 0;
    for (int j = 0; j < l; ++j) {
      if (line[j] == ',') param++;
      if (line[j] == '(' || line[j] == ')' || line[j] == ',') line[j] = ' ';
    }
    switch (param + 1) {
      case 1:
        sscanf(line, "%s %s %s", line1[0], line1[1], line1[2]);
        funciones[i].vtype[0] = line1[2];
        funciones[i].cantP = 1;
        break;
      case 2:
        sscanf(line, "%s %s %s %s", line1[0], line1[1], line1[2], line1[3]);
        funciones[i].vtype[0] = line1[2];
        funciones[i].vtype[1] = line1[3];
        funciones[i].cantP = 2;
        break;
      case 3:
        sscanf(line, "%s %s %s %s %s", line1[0], line1[1], line1[2], line1[3],
               line1[4]);
        funciones[i].vtype[0] = line1[2];
        funciones[i].vtype[1] = line1[3];
        funciones[i].vtype[2] = line1[4];
        funciones[i].cantP = 3;
        break;
      case 4:
        sscanf(line, "%s %s %s %s %s %s", line1[0], line1[1], line1[2],
               line1[3], line1[4], line1[5]);
        funciones[i].vtype[0] = line1[2];
        funciones[i].vtype[1] = line1[3];
        funciones[i].vtype[2] = line1[4];
        funciones[i].vtype[3] = line1[5];
        funciones[i].cantP = 4;
        break;
      case 5:
        sscanf(line, "%s %s %s %s %s %s %s", line1[0], line1[1], line1[2],
               line1[3], line1[4], line1[5], line1[6]);
        funciones[i].vtype[0] = line1[2];
        funciones[i].vtype[1] = line1[3];
        funciones[i].vtype[2] = line1[4];
        funciones[i].vtype[3] = line1[5];
        funciones[i].vtype[4] = line1[6];
        funciones[i].cantP = 5;
        break;
    }
    funciones[i].name = line1[1];
  }
  sort(funciones, funciones + f);
  scanf("%d\n", &v);
  for (int i = 0; i < v; ++i) {
    scanf("%s %s", line1[0], line1[1]);
    ty = line1[0];
    na = line1[1];
    variables[na] = ty;
  }
  scanf("%d\n", &c);
  for (int i = 0; i < c; ++i) {
    gets(line);
    int l = strlen(line);
    int param = 0;
    for (int j = 0; j < l; ++j) {
      if (line[j] == ',') param++;
      if (line[j] == '(' || line[j] == ')' || line[j] == ',') line[j] = ' ';
    }
    int inicio = 0;
    switch (param + 1) {
      case 1:
        sscanf(line, "%s %s", line1[0], line1[1]);
        inicio =
            lower_bound(funciones, funciones + f, funcion(line1[0], line1[1])) -
            funciones;
        break;
      case 2:
        sscanf(line, "%s %s %s", line1[0], line1[1], line1[2]);
        inicio = lower_bound(funciones, funciones + f,
                             funcion(line1[0], line1[1], line1[2])) -
                 funciones;
        break;
      case 3:
        sscanf(line, "%s %s %s %s", line1[0], line1[1], line1[2], line1[3]);
        inicio = lower_bound(funciones, funciones + f,
                             funcion(line1[0], line1[1], line1[2], line1[3])) -
                 funciones;
        break;
      case 4:
        sscanf(line, "%s %s %s %s %s", line1[0], line1[1], line1[2], line1[3],
               line1[4]);
        inicio = lower_bound(funciones, funciones + f,
                             funcion(line1[0], line1[1], line1[2], line1[3],
                                     line1[4])) -
                 funciones;
        break;
      case 5:
        sscanf(line, "%s %s %s %s %s %s", line1[0], line1[1], line1[2],
               line1[3], line1[4], line1[5]);
        inicio = lower_bound(funciones, funciones + f,
                             funcion(line1[0], line1[1], line1[2], line1[3],
                                     line1[4], line1[5])) -
                 funciones;
        break;
    }
    sol = 0;
    while (inicio < f) {
      if ((string)line1[0] != funciones[inicio].name) break;
      bool contar = true;
      if (funciones[inicio].cantP != param + 1) contar = false;
      for (int j = 0; j < param + 1; ++j) {
        if (funciones[inicio].vtype[j] != variables[(string)line1[j + 1]] &&
            funciones[inicio].vtype[j] != "T") {
          contar = false;
        }
      }
      if (contar) sol += 1;
      inicio++;
    }
    printf("%d\n", sol);
  }
  return 0;
}
