P16590 [GKS 2016 #D] Codejamon Cipher

题目描述

**CodejamOn** 怪物使用加密的消息进行交流。其工作原理如下: 每种怪物都有自己独特的词汇表:一个包含 $V$ 个不同单词的列表,单词仅由小写英文字母组成。当怪物说话时,它首先使用词汇表中的单词组成一个句子;同一个单词可以在句子中出现多次。然后,它将句子转换为加密字符串,方法如下: 1. 将句子中的每个单词随机打乱。 2. 删除所有空格。 理解怪物能为你带来巨大优势,因此你正在构建一个工具来完成这项任务。作为第一步,你需要能够根据一个加密字符串,确定有多少种可能的原始句子能够生成该加密字符串。例如,如果怪物的词汇表是 `["this", "is", "a", "monster", "retsnom"]`,并且它说出了加密字符串 `"ishtsiarestmon"`,则有四种可能的原始句子: * "is this a monster" * "is this a retsnom" * "this is a monster" * "this is a retsnom" 你拥有来自同一怪物的 $S$ 个加密字符串。对于每个字符串,你能计算出可能的原始句子的数量吗? **重要**:由于输出可能非常大,我们只要求你输出结果除以素数 $10^9 + 7$($1000000007$)的余数。

输入格式

输入的第一行给出测试用例的数量 $T$;接下来有 $T$ 个测试用例。每个测试用例的第一行包含两个整数 $V$ 和 $S$,分别表示怪物的词汇表大小和加密字符串的数量。随后 $V$ 行,每行包含一个由小写英文字母组成的字符串,表示怪物词汇表中的一个单词。最后 $S$ 行,每行包含一个仅由小写英文字母组成的字符串,表示一个加密句子。保证所有加密句子都是有效的,即每个句子至少有一个可能的原始句子。

输出格式

对于每个测试用例,输出一行,格式为 `Case #x: y`,其中 $x$ 是测试用例编号(从 $1$ 开始),$y$ 是一个空格分隔的列表,包含 $S$ 个整数:按照输入顺序,每个加密句子对应的答案(模 $10^9 + 7$)。

说明/提示

### 限制条件 $1 \le T \le 100$。 $1 \le S \le 5$。 **小数据集(测试集 1 – 可见)** $1 \le \text{词汇表中每个单词的长度} \le 5$。 $1 \le \text{加密字符串的长度} \le 50$。 $5 \le V \le 10$。 **大数据集(测试集 2 – 隐藏)** $1 \le \text{词汇表中每个单词的长度} \le 20$。 $2000 \le \text{加密字符串的长度} \le 4000$。 $200 \le V \le 400$。 翻译由 DeepSeek V4 Pro 完成