#P13259. [GCJ 2014 #2] Trie Sharding

    ID: 13079 远端评测题 3000~5000ms 1024MiB 尝试: 0 已通过: 0 难度: 8 上传者: 标签>2014树形 DP组合数学字典树 TrieGoogle Code Jam

[GCJ 2014 #2] Trie Sharding

Description

一组字符串 S\mathbf{S} 可以被高效地存储在一个字典树(trie)中。字典树是一棵有根树,其中每个节点代表 S\mathbf{S} 中某个字符串的一个前缀,且不重复。

例如,如果 S\mathbf{S} 为 "AAA"、"AAB"、"AB" 和 "B",那么对应的字典树将包含 77 个节点,分别对应前缀:""、"A"、"AA"、"AAA"、"AAB"、"AB" 和 "B"。

我现在有一台服务器,用一个大的字典树来存储 S\mathbf{S}。不幸的是,随着 S\mathbf{S} 的不断增大,我发现很难再将它完整地装进单台服务器的内存中。为了解决这个问题,我打算将 S\mathbf{S} 拆分并存储在 N\mathbf{N} 台不同的服务器上。具体来说,S\mathbf{S} 将被划分成若干个不相交的非空子集 $\mathbf{T}_1, \mathbf{T}_2, \ldots, \mathbf{T}_\mathbf{N}$,然后在每台服务器 ii 上构建仅包含 Ti\mathbf{T}_i 中字符串的字典树。

这种方式的缺点是:所有 N\mathbf{N} 个字典树中的节点总数可能会变多。更糟的是,我无法控制字符串是如何被划分到各个服务器上的!

例如,如果 "AAA"、"AAB"、"AB" 和 "B" 被分配到两台服务器,其中一台存储 "AAA" 和 "B",另一台存储 "AAB" 和 "AB",那么第一台服务器的字典树需要 55 个节点(""、"A"、"AA"、"AAA"、"B"),第二台服务器也需要 55 个节点(""、"A"、"AA"、"AAB"、"AB"),总共就是 1010 个节点。而如果将所有字符串放到一台服务器上,只需要 77 个节点。

现在,给定字符串集 S\mathbf{S} 和服务器数 N\mathbf{N},我希望你帮我计算以下两个问题:

  1. 在最坏的划分方案下,所有服务器上字典树节点数的总和最多是多少?
  2. 有多少种划分方式能导致上述最大节点数?由于这个数可能非常大,请输出其对 1, ⁣000, ⁣000, ⁣0071,\!000,\!000,\!007 取模的结果。

注意:N\mathbf{N} 台服务器是有区别的——如果某种方案中一个字符串出现在 Ti\mathbf{T}_i 中,而另一种方案中它出现在 Tj\mathbf{T}_j 中(iji \neq j),则这两种划分方式被认为是不同的。

Input Format

输入的第一行是测试用例数量 T\mathbf{T}。接下来是 T\mathbf{T} 个测试用例。

每个测试用例第一行包含两个用空格分隔的整数:字符串数量 M\mathbf{M} 和服务器数量 N\mathbf{N}。接下来的 M\mathbf{M} 行,每行包含一个字符串,表示集合 S\mathbf{S} 中的一个元素。

Output Format

对于每个测试用例,输出一行,格式为 "Case #i: X Y",其中 ii 是测试用例编号(从 1 开始),XX 是最坏情况下所有服务器上的节点总数,YY 是使得总节点数为 XX 的划分方案数量,模 1, ⁣000, ⁣000, ⁣0071,\!000,\!000,\!007 之后的结果。

2
4 2
AAA
AAB
AB
B
5 2
A
B
C
D
E
Case #1: 10 8
Case #2: 7 30

Hint

限制条件

  • 1T1001 \leq T \leq 100
  • 字符串集 S\mathbf{S} 中的字符串只包含大写英文字符
  • S\mathbf{S} 中所有字符串互不相同
  • NM\mathbf{N} \leq \mathbf{M}

Small 数据集(9 分)

  • 时间限制:60 3 秒
  • 1M81 \leq M \leq 8
  • 1N41 \leq N \leq 4
  • 每个字符串长度在 111010 之间

Large 数据集(30 分)

  • 时间限制:120 5 秒
  • 1M10001 \leq M \leq 1000
  • 1N1001 \leq N \leq 100
  • 每个字符串长度在 11100100 之间

翻译由 ChatGPT-4o 完成