CF832B Petya and Exam

题目描述

现在情况很艰难。今天 Petya 需要在信息学考试中得 100 分。对 Petya 来说题目似乎很简单,但他觉得自己没有足够的时间完成全部题目,所以请求你帮助他完成其中一道题。 在题目描述中给出一个「模式串」(由小写英文字母、字符 "?" 和 "*" 组成的字符串)。已知该模式串中字符 "*" 最多只出现一次。 同时给出 $n$ 个查询字符串,需要你判断每个查询字符串是否能被模式串匹配。 一开始 Petya 觉得很容易,但后来他发现,这些特殊模式字符的含义与通常的不同: 当且仅当可以将模式串中的每个 "?" 替换为任意一个好字母,每个 "*"(如果存在)替换为任意(包括空串)由坏字母组成的字符串,使得替换后的模式串与查询字符串完全一致时,认为模式串可以匹配该字符串。 所谓好字母,是题目给出的字母集合,所有未包含在内的字母都被视为坏字母。

输入格式

第一行是一个长度在 $1$ 到 $26$ 之间,由互不相同的小写英文字母组成的字符串,表示所有的好字母。 第二行是模式串 $s$,由小写英文字母、字符 "?" 和 "*" 组成($1 \leq |s| \leq 10^5$)。保证模式串中最多包含一个 "*"。 第三行是整数 $n$($1 \leq n \leq 10^5$),表示查询字符串的数量。 接下来的 $n$ 行,每行一个非空的小写英文字母字符串,表示一个查询字符串。 保证所有查询字符串的总长度不超过 $10^5$。

输出格式

输出 $n$ 行,对于第 $i$ 个查询字符串,若能被模式串匹配则输出 "YES",否则输出 "NO"。输出时可以任意选择大小写。

说明/提示

以第一个样例为例,我们可以将两个 "?" 替换为好字母 "a" 和 "b",因此第一个查询的答案是 "YES",第二个查询答案是 "NO",因为模式串的第三个字符无法匹配。 第二个样例的具体说明: - 第一个查询:“NO”,因为 "*" 只能被替换为仅含坏字母的字符串,但此处只能用好字母 "ba"。 - 第二个查询:“YES”,因为 "?" 可以分别替换为对应的好字母,"*" 可以替换为空串,使两个字符串一致。 - 第三个查询:“NO”,因为 "?" 不能替换为坏字母。 - 第四个查询:“YES”,因为 "?" 均可以替换为好字母 "a","*" 可以替换为坏字母 "x"。 由 ChatGPT 5 翻译