CF2257A Creating Abbreviations

题目描述

河狸得到了一个单词集合 $S$,初始时集合中包含 $n$ 个单词。之后他进行了 $m$ 次如下操作: 1. 河狸从集合 $S$ 中组成一个包含一个或多个单词的序列。同一个单词可以在序列中出现多次。然后,他以该序列中每个单词的首字母依次拼接成一个缩写词$^*$。 2. 河狸将所得的缩写词加入集合 $S$,之后可以在随后的操作中像普通单词一样使用该缩写词。 现在给你集合 $S$ 的初始 $n$ 个单词,以及河狸最终形成的 $m$ 个缩写词。请判断河狸是否出现了错误,即是否存在某种操作顺序,使得你所给的所有缩写词都可能按照上述操作产生。注意,这些缩写词不一定是按照你给出的顺序生成的。 $^*$ 一个序列的缩写词是由序列中每个单词的首字母顺序拼接而成。例如,序列 birch OAK birch redwood 的缩写为 BOBR。

输入格式

每组测试数据包含多个测试用例。第一行包含测试用例数 $t$($1 \leq t \leq 500$)。每个测试用例描述如下。 每个测试用例的第一行包含两个整数 $n$ 和 $m$——普通单词的数量和缩写词的数量,分别满足 $1 \leq n, m \leq 100$。 接下来的 $n$ 行,每行包含一个字符串 $w_i$,表示一个普通单词($1 \leq |w_i| \leq 20$)。 接下来的 $m$ 行,每行包含一个字符串 $a_i$,表示 Bobr 形成的一个缩写词($1 \leq |a_i| \leq 20$)。 所有普通单词均由小写英文字母组成,所有缩写词均由大写英文字母组成。在每个测试用例中,所有字符串 $w_1, w_2, \ldots, w_n, a_1, a_2, \ldots, a_m$ 都互不相同。 所有测试用例中所有字符串的总长度不超过 $50\,000$。

输出格式

对于每个测试用例,若存在一种合理的操作顺序使得所给的所有缩写词都能被构造出来,输出 "YES";否则,输出 "NO"。 你可以用任意大小写输出。例如 "yEs"、"yes"、"Yes" 和 "YES" 都会被判为正确。

说明/提示

在第一个测试用例中,顺序 AG、BG、CG、ABC 是合理的。前三个缩写可以由单词对 apple 和 grand、banana 和 great、cherry 和 good 分别得到。之后可以用已生成的 AG、BG、CG 组成 ABC。 在第二个测试用例中,可以用 apple 两次来构造 AA。 在第三个测试用例中,可以先用 apple 构造 A,再用 apple 和已生成的缩写 A 构造 AA。 在第四个测试用例中,可以证明不存在所需的缩写生成顺序。 由 ChatGPT 5 翻译