P0559

[BeiJing wc2012]孵化者

[BeiJing wc2012]孵化者

「我要将有关魔法和奇迹的一切,封印于卡片之中!」

「这个心愿……要是这个心愿能够实现……」

「对,这样你我都将化为卡片!」

现在,孵化者被封印在了一张卡片里。这张卡片的效果是:可以使一张魔法卡片变为两张(可能是其他类型的)魔法卡片。显然,它是非常珍贵且有价值的卡片。

我们接下来要关注的是一个以它为背景的单人卡片游戏,叫做《Incubator》。这个游戏用于训练 SpellCard 的使用技巧,同时也体现了孵化者无与伦比的再生能力。

游戏的道具是一些卡片,分为两类:一类是 Spell,一类是 Witch。我们用大写字母 A、B、…… 来表示不同的 Spell,用小写字母 a、b、…… 来表示不同的 Witch。

游戏用到两个牌堆,我们称它们为 S 堆和 W 堆。S 堆中只可能有 Spell,W 堆中只可能有 Witch。

游戏开始时,S 堆仅有一张卡片 S,而 W 堆中会有若干张卡片。我们把这个信息用一个字符串 ww 来表示,其中 ww 的首个字符对应 W 堆顶部的卡片,ww 的下一个字符对应 W 堆从上向下数第二张卡片(如果有的话),依次类推。

游戏的目标是通过操作使得这两个牌堆都变成空的,一共有两种操作:

  1. 使用魔法消灭 Witch:只有当 S 堆顶部的 Spell 克制 W 堆顶部的 Witch 时才可以进行。使用后,这两张卡片都被移除。
  2. 使用 Incubator 进行孵化:只要 S 堆非空就可以进行,需要依照某一条孵化规则。将 S 堆顶部的卡片移除,再由该孵化规则在 S 堆顶部加入两张新的卡片。

这个游戏一共有 N1N_1 个克制关系以及 N2N_2 个孵化规则。每一个克制关系由一个字符串给出,例如 A->a 表示 A 克制 a。每一个孵化规则也由一个字符串给出,例如 S->AB 表示可以将 S 从堆顶移除,之后加入 A 和 B,其中 A 在 B 的上面。

在给定规则以及串 ww 的情形下,如果存在一个有限多步就可以使得两牌堆均为空的操作方法,那么我们称这个游戏是有解的。

你的任务是:给定规则以及 TT 个串 w1,w2,…,wTw_1, w_2, \ldots, w_T,分别判定这个规则和串所对应的游戏是否有解。

输入格式

第一行一共有两个正整数 N1,N2N_1, N_2。

接下来 N1N_1 行,每行一个串,表示一个克制关系。

接下来 N2N_2 行,每行一个串,表示一个孵化规则。

接下来 TT 行,每行一个串 wiw_i。

输出格式

一共输出 TT 行,每行为 YES 或 NO(不包含引号),表示对应的串和规则组成的游戏是否有解:有解则输出 YES,否则输出 NO。

样例输入

2 1
  A->a
  B->b
  S->AB
  ab
  cd

样例输出

YES
NO

数据范围

对于 100%100\% 的数据:

  • 1≤N1≤201\le N_1\le 20;
  • 1≤N2≤201\le N_2\le 20;
  • 1≤∣wi∣≤201\le |w_i|\le 20;
  • 1≤T≤1001\le T\le 100。

另外保证:

  • 所有的克制关系串都是合法的,即具有 A->a 的形式,其中 A 是某个大写字母,a 是某个小写字母;
  • 所有的孵化规则串都是合法的,即具有 S->AB 的形式,其中 S、A、B 是某些大写字母,它们可以相同;
  • -> 是一个长度为 22 的串,其首个字符的 ASCII 码为 4545,下一个字符的 ASCII 码为 6262(均是在十进制下),这个符号也是 C++ 中的 structure dereference 运算符;
  • 串 wiw_i 仅包含小写字母。

来源与许可

本题为 BeiJing WC 2012 试题「孵化者」,题面与测试数据整理自 BZOJ 2664。

样例 1

输入

2 1
  A->a
  B->b
  S->AB
  ab
  cd

输出

YES
NO