Pheatr 在 TopForces 等在线编程竞赛平台上拥有许多账号。有时,当 Pheatr 参加 TopForces 的比赛却无法直接获得好成绩时,他会利用一些申请用于作弊的额外账号(即“小号”)来获取更高的分数:起初,他编写一些可以通过预测试的错误代码,并用这些小号提交。之后,他立即使用他的主账号挑战这些小号,因为一次成功的挑战能为他额外提供 100 分。
实际上,Pheatr 并不是唯一在比赛中作弊的人。许多参赛者在在线编程竞赛中都使用同样的策略。众所周知,每个人只有一个主账号。如果一个人的作弊行为被揭露,他的主账号将被永久封禁。为了防止这一臭名昭著的事实被曝光,每位参赛者注册的小号不超过两个。尽管面临巨大的风险,这些参赛者在注册小号时总是遵循同样的规则:属于同一位参赛者的小号用户名必须是该参赛者主账号用户名的前缀,或者主账号的用户名必须是该小号用户名的前缀。
最近,TopForces 的一次泄露事件提供了一份使用小号作弊的已核实作弊者名单,其中包含了他们主账号的用户名。此外,TopForces 还发布了一份可疑账号名单,暗示其中一些可能是小号。为了区分这些可疑账号并指出它们的所有者,Pheatr 打算根据已发布的信息描述所有可能性。当然,应该注意到,一些可疑账号可能是被冤枉的,并不属于任何已知的作弊者。
在认可了你出色的编程能力后,Pheatr 请你计算在已核实作弊者和可疑账号之间建立从属关系的所有不同可能性的总数。如果两种可能性中,每个可疑账号要么同时被冤枉,要么属于同一位竞争对手,则这两种可能性被视为相同。由于答案可能非常大,你只需要报告答案对 $(10^9 + 7)$ 取模的结果。
输入格式
输入包含多个测试用例,第一行包含一个正整数 $T$,表示测试用例的数量,最多为 100。
对于每个测试用例,第一行包含两个整数 $n$ 和 $m$,分别表示泄露名单中已知的作弊者数量和 TopForces 提供的可疑账号数量,其中 $1 \le n, m \le 1000$。
接下来的 $n$ 行,每行包含一个由小写字母组成的非空字符串 $s$,表示一名已知作弊者的主账号用户名,其中 $s$ 的长度不超过 10。
接下来的 $m$ 行,每行包含一个由小写字母组成的非空字符串 $t$,表示一个可疑账号的用户名,其中 $t$ 的长度不超过 10。
我们保证同一测试用例中出现的所有用户名都是不同的。
输出格式
对于每个测试用例,输出一行包含 “Case #x: y”(不含引号),其中 $x$ 是从 1 开始的测试用例编号,$y$ 是该测试用例的答案对 $(10^9 + 7)$ 取模的结果。
样例
输入 1
3 1 2 a aa aaa 1 2 aa a ab 5 5 a ah ahd ahdo ahdoc ahdoca ahdocah ahdocahd ahdocahdo ahdocahdoc
输出 1
Case #1: 4 Case #2: 2 Case #3: 6396
说明
在第一个样例中,小号 aa 和 aaa 都可以属于 a 的所有者。
在第二个样例中,小号 ab 不能属于 aa 的所有者,而 a 可以。
在第三个样例中,每个小号都可以属于 TopForces 泄露名单中的任何人。