在 Minecraft 游戏中,合成是一种消耗已有的物品获取新物品的方式。
在合成某一件物品时,玩家需要按照该物品的合成表规定的方式,将一系列原料物品添加在一个 的物品表格中,从而得到该物品。
合成表可以分为有序合成和无序合成两种类型。
其中,有序合成要求每个原料物品必须放在合成表为其规定的方格中,要求玩家摆放出的物品表格必须和合成表完全对应。
而无序合成则不关心每个原料物品摆放的位置,只要求玩家给出的原料物品集合能够对应上合成表规定的原料物品集合即可。
下面给出了一个无序合成和有序合成的对比例子。其中,上方是南瓜派的合成表,它只要求玩家摆放的物品中含有(且仅含有)一个鸡蛋,一个南瓜,一份白糖即可,无论这三样物品摆放在哪里,顺序如何,都可以完成合成(但不可以多放任何物品,也不可以少放任何物品);下方是曲奇的合成表,它要求玩家必须在物品表格第一行、第三行放空,并在第二行从左往右依次放置一份小麦、一份可可豆、一份小麦才可以完成合成。
在这样的设定下,验证玩家摆放的物品表格是否满足某一个合成表是容易的:
- 对于有序合成的合成表,只需验证每一个方格中的原料物品是否和合成表一致即可。
- 对于无序合成的合成表,只需逐一将玩家摆放的所有原料物品对应上合成表中的物品即可。
然而,Minecraft 还引入了复杂的物品大类机制——可能有多种物品属于同一物品“大类”,例如,云杉原木和橡木原木都属于原木,黑石和圆石都属于类圆石方块,而合成表也可以只要求某种属于特定物品“大类”的物品而非某种具体的物品。
注:物品大类可以有重叠,即一个物品可以属于多种物品大类。
此时,在有序合成的情境下,我们仍然可以通过简单地确认每个方格中的物品是否属于合成表对应方格的物品大类来验证玩家摆放的物品表格是否满足某个合成表。
然而,在无序合成的情境下,我们就遇到了麻烦:假如有一个摆放有 [黑石, 圆石] 的物品表格,并且存在一个无序合成的合成表对物品的要求是 [类圆石方块, 黑石],显然这个物品表格是满足合成表要求的。但如果我们直接先将黑石对应上合成表中的类圆石方块,就会导致剩下的圆石无法对应合成表中的黑石,从而错误判断该物品表格不满足合成表的要求。
因此,我们需要设计一个更可靠的算法来验证玩家提供的物品表格是否满足无序合成的合成表,这也就是本题要求你完成的任务。
为了省去一些恼人且和本题主旨无关的细节,本题对给出的合成表做出了一些限定(可以证明,在这种情况下上述朴素算法的问题仍然是存在的):
- 所有合成表对其原料物品的要求都是属于某一物品大类(下文我们将「合成表要求某个原料物品属于某一物品大类」称为「合成表要求了某一物品大类」)。比如,我们不会给出 [类圆石方块, 黑石] 这种合成表,只会给出 [类圆石方块, 原木] 这种合成表。
- 一个合成表不会多次要求某一物品大类。比如,不会给出 [类圆石方块, 类圆石方块] 这种合成表。
- 某个物品大类至多只会被一个合成表所要求。比如,如果某一合成表中出现了类圆石方块,那么其他合成表中一定不会有类圆石方块。
- 所有的合成表都是无序合成的,因此我们不会给出合成表中每个物品大类的对应位置。
接下来,我们将以一种特殊但方便的形式(详见输入格式)给出游戏中的 种物品, 种物品大类,玩家摆放的 个物品表格, 个满足以上限定的合成表,以及物品种类和大类之间的对应关系。而你的任务是对于每个物品表格,判断出它满足了哪些合成表的要求。