问题描述
克拉克是一名人格分裂患者。某一天,克拉克分裂成了一名程序猿,非常努力的码代码。可是他发现c++中的类型转换有点蛋疼。如果一个表达式足够长,就极易因为不存在转换而报错或者转成了不是自己期望的类型。有一天编译器坏了(雾),于是他想完成编译器做的工作。
然后他就把这个艰巨的任务交给你辣!
克拉克的表达式是这样的,表达式只有4种成分组成:类型、变量、括号、运算符。其中类型、变量是由26个小写字母组成的字符串。括号是'$($'和'$)$'。运算符只有一个$ * $,而且遵循从左到右、括号优先的运算顺序。
表达式有两种规则:
1. $type(a)$:表示将$a$这个变量转换成$type$类型,得到一个新变量(当运算到$type(a)$时$type$必须是类型,$a$必须是变量,类型、括号只会出现在这种规则里。括号成对出现,即括号匹配)。
2. $a * b$:将$b$变量转换成$a$变量的类型后再做运算,得到一个$a$变量类型的一个新变量(当运算到$*$时,必须保证$a$和$b$都是变量)。
现在克拉克给你一个表达式、变量和一些类型转换的规则,他需要你判断这个表达式是否合法。如果合法,请告诉克拉克最终表达式计算出来的是什么类型。
不合法的情况:
1. 出现的标识符(变量名和类型名)存在重名,或变量类型是不存在的类型。
2. 表达式里出现了不是类型也不是变量的单词。
3. 转换过程中类型无法转换。
4. 不符合上述表达式规则。
一些解释和约定:
1. 单独的给出变量也是一个合法的表达式。
2. 如果$type(a)$中的$a$是一个表达式,那么先算出$a$得到一个新变量,然后才执行规则$1$。
3. $type$类型一定能转换成$type$类型。
4. $typeC$能直接转换成$typeB$,$typeB$能直接转换成$typeA$,不代表$typeC$能直接转换成$typeA$。
5. 表达式$b * type(a)$的转换过程是先将$a$转换成$type$,再转换成$b$变量的类型,最后得到$b$类型的一个新变量。
输入描述
第一行一个整数$T(1 \le T \le 10)$,表示一共有$T$组数据。
每组数据第一行是一个整数$n(1 \le n \le 500)$,表示有$n$个变量。
接下来$n$行,每行两个字符串$value_i$和$valueType_i$,分别表示这个变量的变量名和类型。
再接下来是一个整数$m(1 \le m \le 500)$,表示有$m$个类型。
接下来$m$行,每行第一个是字符串$type_i$表示类型名,然后是一个整数$k(0 \le k \le m)$,表示$type_i$类型能直接转换的类型数,紧接着后面$k$个整数,每个整数表示一个类型序号$b_j(1 \le b_j \le m)$。
每组数据最后一行是一个字符串,由类型、变量、括号、运算符组成,表示这个表达式$E(1 \le |E| \le 500000)$。
保证$1 \le \sum_{i=1}^{m} |type_i| + \sum_{i=1}^{n} |value_i| \le 200000, 1 \le \sum_{i=1}^{n} |valueType_i| \le 200000$。
输出描述
对于每组数据,如果能这个表达式是合法的,则输出这个表达式的类型名。否则输出$-1$。
输入样例
5
2
a char
b int
2
int 0
char 1 1
int(b*a)
2
a char
b int
2
int 0
char 1 1
char(a*b)
2
a char
b int
2
int 1 2
char 1 1
char(a*b)
2
a char
b int
2
int 1 2
char 1 1
char*char(a*b)*((
1
a char
1
char 0
char
输出样例
int
-1
char
-1
-1
Hint
样例1:首先$a$转换成$b$,得到一个类型为$int$的变量,然后这个变量再转换成类型为$int$的变量,最终得到的类型就是$int$
样例2:$b$的$int$类型无法转换$a$的$char$类型,输出$-1$
样例3:首先$b$转换成$a$,得到一个类型为$char$的变量,然后这个变量再转换成类型为$char$的变量,最终得到的类型就是$char$
样例4:不符合规则一(括号无法匹配、$char*char$左边的$char$不符合"类型只出现在$type(a)$里"的规则)
样例5:不符合规则一(类型只能出现在$type(a)$的规则里)