P16649 [GKS 2018 #D] Funniest Word Search

题目描述

Siv 的生日在下周,Cel 正在为她准备生日礼物。因为 Siv 喜欢拼图,Cel 决定制作一个单词搜索谜题作为礼物。 在单词搜索谜题中,解题者会得到一个 $R$ 行 $C$ 列的矩形网格,解题者需要找出隐藏在网格中的所有有效单词。每个隐藏单词可以在网格中水平或垂直(但不能对角线)出现,可以是正向或反向。隐藏单词可以重叠。 Cel 有一个包含 $W$ 个不同单词的字典;这些单词是唯一可以隐藏在谜题网格中的单词。(当然,并非网格中每个连续的水平或垂直部分都必然包含某个隐藏单词。)这些单词不一定是真实的英语单词。每个单词可能在网格中出现一次或多次,也可能根本不出现。 Cel 已经创建好了单词搜索谜题。然而,问题在于:谜题太大,无法打印在一张纸上。由于 Siv 的生日即将到来,没有足够的时间从头创建一个新的单词搜索谜题。因此,Cel 想知道她是否可以通过简单地选择原始网格中的一个非空、与网格对齐的子网格来缩小网格尺寸。 随机选择一个子网格可能会导致谜题无聊,没有太多隐藏单词。因此,Cel 希望选择具有最大趣味值的子网格,其中子网格的趣味值定义为: 趣味值 = (匹配单词的总长度) / (子网格的宽度 + 子网格的高度) 注意: - 单词必须完整地出现在子网格中才被计入。 - 如果一个单词在子网格中出现 $x$ 次,则其长度应在上述公式中累加 $x$ 次。 - 如果一个单词及其反向都在子网格中出现(即使在相同位置!),我们也会将这两次出现都计入。 - 具有最大趣味值的子网格可能就是整个原始网格。 你能帮助 Cel 找出子网格可能的最大趣味值,以及具有该趣味值的不同子网格的数量吗?两个子网格被认为是不同的,当且仅当存在网格中的某个格子(即某个 (行, 列) 位置)只属于其中一个子网格而不属于另一个。

输入格式

输入的第一行给出测试用例的数量 $T$。接下来有 $T$ 个测试用例。每个测试用例的结构如下: - 第一行包含三个整数 $R$、$C$ 和 $W$,含义如上所述。 - 接下来的 $R$ 行,每行恰好包含 $C$ 个大写英文字母。 - 接下来的 $W$ 行,每行恰好包含一个有效单词。每个单词只包含大写英文字母。

输出格式

对于每个测试用例,输出一行,格式为 `Case #x: y/z n`,其中: - $x$ 是测试用例编号(从 $1$ 开始)。 - $y/z$ 是一个不可约分数,等于子网格的最大可能趣味值(如上所述)。 - $y$ 是一个非负整数。 - $z$ 是一个正整数。 - $n$ 是趣味值等于 $y/z$ 的子网格个数。 如果 $y$ 和 $z$ 的最大公约数为 $1$,则称 $y/z$ 为不可约分数。

说明/提示

记 $(i, j)$ 表示第 $i$ 行第 $j$ 列的格子。 在样例 #1 中,趣味值最高的子网格是整个网格。有效单词 `A` 在网格中出现 $8$ 次: - 在格子 $(1, 1)$ 处水平方向出现 $2$ 次(正向一次,反向一次)。 - 在格子 $(1, 1)$ 处垂直方向出现 $2$ 次(正向一次,反向一次)。 - 在格子 $(1, 2)$ 处出现 $4$ 次(水平和垂直方向,正向和反向各一次)。 在样例 #2 中,有 $3$ 个子网格的趣味值等于 $0$: - 仅包含一个格子 $(1, 1)$ 的子网格。 - 仅包含一个格子 $(1, 2)$ 的子网格。 - 左上角在 $(1, 1)$、右下角在 $(1, 2)$ 的子网格。 ### 限制条件 - $1 \le T \le 100$。 - $1 \le R \le 100$。 - $1 \le C \le 100$。 - 有效单词列表中没有重复的单词。 - 有效单词列表中所有单词的总长度不超过 $5000$ 个字母。 **小数据集(测试集 1 – 可见)** - 每个有效单词的长度恰好为 $1$。 - $1 \le W \le 26$。 **大数据集(测试集 2 – 隐藏)** - $1 \le W \le 1000$。 翻译由 DeepSeek V4 Pro 完成