#142 · trie-sharding-803b1d

Trie 分片

Not startedHard
Time10.0 s
Memory1,024 MB
Submissions0
Acceptance0.0%
0%100%

Statement

一个字符串集合 S 可以高效地存储在 *trie* 中。trie 是一棵有根树,对于 S 中每个字符串的每个前缀都有一个节点,没有重复。

例如,如果 S 是 "AAA", "AAB", "AB", "B",对应的 trie 将包含 7 个节点,分别对应前缀 "", "A", "AA", AAA", "AAB", "AB", 和 "B"。

我有一个服务器,用一棵大 trie 存储 S。不幸的是,S 变得非常大,我无法将所有内容放入一个服务器的内存中。为了解决这个问题,我想改为将 S 存储在 N 个独立的服务器上。具体来说,S 将被划分为不相交的非空子集 T$_{1}$, T$_{2}$, ..., T$_{N}$,并且在每个服务器 i 上,我将构建一棵仅包含 T$_{i}$ 中字符串的 trie。这种方法的缺点是所有 N 棵 trie 的节点总数可能会增加。更糟糕的是,我无法控制字符串集合如何划分!

例如,假设 "AAA", "AAB", "AB", "B" 被分成两个服务器,一个包含 "AAA" 和 "B",另一个包含 "AAB", "AB"。那么第一个服务器上的 trie 需要 5 个节点 ("", "A", "AA", "AAA", "B"),第二个服务器上的 trie 也需要 5 个节点 ("", "A", "AA", "AAB", "AB")。在这种情况下,两个服务器总共需要 10 个节点,而如果我可以将所有内容放在一个服务器上,则只需要 7 个节点。

给定字符串到 N 个服务器的分配,我想计算所有服务器上节点总数的最坏情况,以及这种情况发生的可能性有多大。然后我可以决定我的计划是好的还是风险太大。

给定 S 和 N,我可能得到的最大的节点总数是多少?此外,有多少种选择 T$_{1}$, T$_{2}$, ..., T$_{N}$ 的方式使得节点总数最大?注意 N 个服务器是不同的——如果一个字符串在一种安排中出现在 T$_{i}$,在另一种安排中出现在 T$_{j}$ (i != j),那么这两种安排被认为是不同的。输出可能的安排数除以 1,000,000,007 后的余数。

Input

输入的第一行给出测试用例的数量 T。接下来是 T 个测试用例。每个测试用例以一行开始,包含两个用空格分隔的整数:M 和 N。接下来 M 行,每行包含 S 中的一个字符串。

### 数据范围

- 1 ≤ T ≤ 100.
- S 中的字符串只包含大写英文字母。
- S 中的字符串都不同。
- N ≤ M
- 1 ≤ M ≤ 8
- 1 ≤ N ≤ 4
- S 中的每个字符串长度在 1 到 10 个字符之间(含)。
- 1 ≤ M ≤ 1000
- 1 ≤ N ≤ 100
- S 中的每个字符串长度在 1 到 100 个字符之间(含)。

Output

对于每个测试用例,按测试用例顺序逐个输出答案,每个测试用例输出一行包含 "X Y",其中 X 是所有 trie 合并后的最坏情况节点数,Y 是将字符串分配到服务器使得所有 N 个服务器中的节点数为 X 的方式数(对 1,000,000,007 取模)。

Examples

Example 1

Input

2
4 2
AAA
AAB
AB
B
5 2
A
B
C
D
E

Output

10 8
7 30

Constraints

  • Time limit: 10000 ms
  • Memory limit: 1048576 KB
  • Tag: dynamic-programming
  • Tag: math
  • Tag: string

Loading language catalog...