给定一个文本 $T$ 和一个模式串 $P$。你需要检查是否可以通过删除 $T$ 中的某些字母,使得剩余的符号恰好构成 $P$。例如,单词 programming 可以通过部分删除得到 pong、program 或 roaming(但不能得到 map,因为字母必须保持原有的顺序)。这两个单词都仅由小写英文字母组成。
这里有一个特殊之处:文本 $T$ 是由一组方程编码的。这些方程使用特殊符号(每个符号由一个大写字母组成的单词表示),每个符号编码了字母表 $\{a, \dots, z\}$ 上的某个单词。每个方程的形式如下: $A = \text{字母表 } \{a, \dots, z\} \text{ 上的一个单词}$ 或者 $A = B + C$ 其中 $A, B, C$ 可以是任何特殊符号,而 $+$ 号表示单词的连接。该系统满足: 无歧义性(unambiguous)—— 对于固定的符号 $A$,左侧为 $A$ 的方程有且仅有一个。 无环性(acyclic)—— 如果你从任何符号 $A$ 开始,并根据方程进行替换(用右侧替换左侧),你永远无法再次得到包含 $A$ 的表达式。
这样的系统总是有一个唯一的解。例如,在以下系统中: START = FIRST + SECND FIRST = D + E SECND = F + E D = good E = times F = bad
符号 START 编码了单词 goodtimesbadtimes。 给定一个单词 $P$ 作为模式串,一个方程组,以及该系统的一个特定起始符号 $S$,确定模式串 $P$ 是否出现在由 $S$ 编码的单词中。
输入格式
输入的第一行包含测试用例的数量 $T$。接下来是各测试用例的描述: 每个测试用例的第一行包含一个整数 $k$ ($1 \leqslant k \leqslant 500$),表示方程的数量。接下来的 $k$ 行包含方程。每个方程具有题目描述中给出的两种形式之一,单词、加号和等号之间用空格分隔。每个单词(包括符号名称)的长度至少为 1,至多为 5。 下一行包含一个单独的特殊符号(一个大写字母组成的单词),最后一行包含一个非空单词,由最多 2 000 个小写字母组成。它们分别是起始符号和要查找的模式串。
输出格式
按输入中出现的顺序输出各测试用例的答案。对于每个测试用例,在单独的一行中打印答案:如果模式串出现在给定的编码单词中,则输出 YES,否则输出 NO。
样例
输入 1
1 6 START = FIRST + SECND FIRST = D + E SECND = F + E D = good E = times F = bad START debate
输出 1
YES