CF1476E Pattern Matching

题目描述

给定 $ n $ 个模式串 $ p_1, p_2, \dots, p_n $ 和 $ m $ 个字符串 $ s_1, s_2, \dots, s_m $。每个模式串 $ p_i $ 由 $ k $ 个字符组成,这些字符要么是小写拉丁字母,要么是通配符(用下划线 `_` 表示)。所有模式串互不相同。每个字符串 $ s_j $ 由 $ k $ 个小写拉丁字母组成。 如果对于 $ 1 $ 到 $ k $ 的每个 $ i $,都有 $ b_i $ 是通配符或 $ b_i = a_i $,则称字符串 $ a $ 与模式串 $ b $ 匹配。 你需要重新排列这些模式串,使得第 $ j $ 个字符串匹配到的第一个模式串是 $ p[mt_j] $。允许保持原来的顺序不变。 你能完成这样的重排吗?如果可以,输出任意一种合法的顺序。

输入格式

第一行包含三个整数 $ n, m, k $($ 1 \le n, m \le 10^5 $,$ 1 \le k \le 4 $)——模式串的数量、字符串的数量以及每个模式串和字符串的长度。 接下来 $ n $ 行,每行包含一个模式串——由 $ k $ 个小写拉丁字母或下划线组成。所有模式串互不相同。 接下来 $ m $ 行,每行包含一个字符串——由 $ k $ 个小写拉丁字母组成,以及一个整数 $ mt $($ 1 \le mt \le n $)——对应字符串应该匹配的第一个模式串的索引。

输出格式

如果无法通过重排使得第 $ j $ 个字符串匹配到的第一个模式串是 $ p[mt_j] $,输出 "NO"。 否则,第一行输出 "YES"。第二行包含 $ 1 $ 到 $ n $ 的 $ n $ 个互不相同的整数,表示模式串的顺序。如果存在多种答案,输出任意一种即可。

说明/提示

第一个样例中,重排后的模式串顺序如下: - aaaa - \_\_b\_ - ab\_\_ - \_bcd - \_b\_d 因此,第一个字符串匹配到的模式串依次为 ab\_\_, \_bcd, \_b\_d,其中第一个是 ab\_\_,即 $ p[4] $。第二个字符串匹配到的模式串依次为 \_\_b\_ 和 ab\_\_,其中第一个是 \_\_b\_,即 $ p[2] $。第三个字符串匹配到的模式串依次为 \_bcd 和 \_b\_d,其中第一个是 \_bcd,即 $ p[5] $。 该测试数据的答案不唯一,也存在其他合法的顺序。 在第二个样例中,cba 与 \_\_c 不匹配,因此不存在合法的顺序。 在第三个样例中,顺序 (a\_, \_b) 使得两个字符串都先匹配到模式串 1,而顺序 (\_b, a\_) 使得两个字符串都先匹配到模式串 2。因此,不存在能够同时满足结果 1 和 2 的顺序。