#P13259. [GCJ 2014 #2] Trie Sharding
[GCJ 2014 #2] Trie Sharding
Description
一组字符串 可以被高效地存储在一个字典树(trie)中。字典树是一棵有根树,其中每个节点代表 中某个字符串的一个前缀,且不重复。
例如,如果 为 "AAA"、"AAB"、"AB" 和 "B",那么对应的字典树将包含 个节点,分别对应前缀:""、"A"、"AA"、"AAA"、"AAB"、"AB" 和 "B"。
我现在有一台服务器,用一个大的字典树来存储 。不幸的是,随着 的不断增大,我发现很难再将它完整地装进单台服务器的内存中。为了解决这个问题,我打算将 拆分并存储在 台不同的服务器上。具体来说, 将被划分成若干个不相交的非空子集 $\mathbf{T}_1, \mathbf{T}_2, \ldots, \mathbf{T}_\mathbf{N}$,然后在每台服务器 上构建仅包含 中字符串的字典树。
这种方式的缺点是:所有 个字典树中的节点总数可能会变多。更糟的是,我无法控制字符串是如何被划分到各个服务器上的!
例如,如果 "AAA"、"AAB"、"AB" 和 "B" 被分配到两台服务器,其中一台存储 "AAA" 和 "B",另一台存储 "AAB" 和 "AB",那么第一台服务器的字典树需要 个节点(""、"A"、"AA"、"AAA"、"B"),第二台服务器也需要 个节点(""、"A"、"AA"、"AAB"、"AB"),总共就是 个节点。而如果将所有字符串放到一台服务器上,只需要 个节点。
现在,给定字符串集 和服务器数 ,我希望你帮我计算以下两个问题:
- 在最坏的划分方案下,所有服务器上字典树节点数的总和最多是多少?
- 有多少种划分方式能导致上述最大节点数?由于这个数可能非常大,请输出其对 取模的结果。
注意: 台服务器是有区别的——如果某种方案中一个字符串出现在 中,而另一种方案中它出现在 中(),则这两种划分方式被认为是不同的。
Input Format
输入的第一行是测试用例数量 。接下来是 个测试用例。
每个测试用例第一行包含两个用空格分隔的整数:字符串数量 和服务器数量 。接下来的 行,每行包含一个字符串,表示集合 中的一个元素。
Output Format
对于每个测试用例,输出一行,格式为 "Case #i: X Y",其中 是测试用例编号(从 1 开始), 是最坏情况下所有服务器上的节点总数, 是使得总节点数为 的划分方案数量,模 之后的结果。
2
4 2
AAA
AAB
AB
B
5 2
A
B
C
D
E
Case #1: 10 8
Case #2: 7 30
Hint
限制条件
- 字符串集 中的字符串只包含大写英文字符
- 中所有字符串互不相同
Small 数据集(9 分)
- 时间限制:
603 秒 - 每个字符串长度在 到 之间
Large 数据集(30 分)
- 时间限制:
1205 秒 - 每个字符串长度在 到 之间
翻译由 ChatGPT-4o 完成
京公网安备 11011102002149号