D. Язык программирования
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Недавно Валерий познакомился с совершенно новым языком программирования. Больше всего в этом языке его привлекли шаблонные функции и процедуры. Напомним, что шаблонами называются средства языка, предназначенные для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).

Валерий решил более подробно изучить шаблонные процедуры этого языка. Описание шаблонной процедуры состоит из имени процедуры и списка типов ее параметров. В качестве параметров шаблонных процедур могут использоваться параметры обобщенного типа T.

Вызов процедуры состоит из имени процедуры и списка переменных-параметров. Назовем процедуру подходящей для данного вызова, если выполняются условия:

  • ее имя совпадает с именем вызванной процедуры;
  • количество ее параметров совпадает с количеством параметров вызванной процедуры;
  • типы ее параметров совпадают с соответствующими типами переменных в вызове процедуры. Тип параметра совпадает с типом переменной, если параметр имеет обобщенный тип T, либо типы переменной и параметра совпадают.

Вам дано описание некоторого набора шаблонных процедур. Также дан список переменных, используемых в программе, а также непосредственные вызовы процедур с использованием описанных переменных. Для каждого вызова от Вас требуется посчитать количество процедур, подходящих данному вызову.

Входные данные

В первой строке задано единственное целое число n (1 ≤ n ≤ 1000) — количество шаблонных процедур. Далее в n строках задано описание процедур, в следующем формате:

«void procedureName (type_1, type_2, ..., type_t)» (1 ≤ t ≤ 5), где void — ключевое слово, procedureName — имя процедуры, type_i — тип очередного параметра. Типами параметров языка могут являться «int», «string», «double», а также ключевое слово «T», которое обозначает обобщенный тип.

В следующей строке задано единственное целое число m (1 ≤ m ≤ 1000) — количество используемых переменных. Далее в m строках задано описание переменных, в следующем формате:

«type variableName», где type — тип переменной, который может принимать значения «int», «string», «double», variableName — имя переменной.

В следующей строке задано единственное целое число k (1 ≤ k ≤ 1000) — количество вызовов процедур. Далее в k строках заданы вызовы процедур в следующем формате:

«procedureName (var_1, var_2, ..., var_t)» (1 ≤ t ≤ 5), где procedureName — имя процедуры, var_i — имя очередной переменной.

В строках описания переменных, шаблонных процедур и их вызовов могут присутствовать пробелы в начале строки, в конце строки, перед и после скобок и запятых. Пробелы могут присутствовать до и после ключевого слова void. Длина каждой строки входных данных не превосходит 100 символов. Имена переменных и процедур являются непустыми строками из латинских строчных букв и цифр длиной не более 10 символов. Отметим, что это — единственное ограничение на имена переменных и процедур. В вызовах процедур используются только описанные переменные. Имена переменных различны. Никакие две процедуры не совпадают. Две процедуры совпадают, если они имеют одинаковые имена, а также упорядоченные наборы типов их параметров совпадают.

Выходные данные

В каждую из k строк выведите единственное число. Число в i-ой строке означает количество подходящих шаблонных процедур под i-ый вызов. Вызовы нумеруются в том порядке, в котором они заданы во входных данных.

Примеры
Входные данные
4
void f(int,T)
void f(T, T)
void foo123 ( int, double, string,string )
void p(T,double)
3
int a
string s
double x123
5
f(a, a)
f(s,a )
foo (a,s,s)
f ( s ,x123)
proc(a)
Выходные данные
2
1
0
1
0
Входные данные
6
void f(string,double,int)
void f(int)
void f ( T )
void procedure(int,double)
void f (T, double,int)
void f(string, T,T)
4
int a
int x
string t
double val
5
f(t, a, a)
f(t,val,a)
f(val,a, val)
solve300(val, val)
f (x)
Выходные данные
1
3
0
0
2