#P14547. [IO 2024 #3] 莫图努伊部落的语言

[IO 2024 #3] 莫图努伊部落的语言

题目描述

对我们来说,屏幕上当然显示的是说我们母语的角色,但莫图努伊部落的母语要复杂得多。

该语言总共有 nn 个字母,每个字母对应的声音我们用数字 a1,…,ana_1, \ldots, a_n 表示。不同的字母可能对应相同的声音。该语言中恰好有 2n−12^n - 1 个单词,每个单词都是这 nn 个字母的任意子序列(单词中字母的顺序与字母表中的顺序一致)。

用 sis_i 表示按字典序排列的第 ii 个单词的 发音。即取该语言的所有单词,写出每个单词的声音序列,并按升序排列这些序列。这里我们认为单词 xx 小于单词 yy,如果要么 xx 的声音序列是 yy 声音序列的前缀,要么 xx 中第一个不同的声音小于 yy 中对应的声音。

你的任务是找到莫图努伊岛部落语言中发音最小的 kk 个单词。由于这些单词的总长度可能过大,请改为输出这些单词的哈希值,其中单词 s=c1c2…ck‾s = \overline{c_1 c_2 \ldots c_k} 的哈希值为

$$h(s) = (a_{c_1} B^{k-1} + a_{c_2} B^{k-2} + \ldots + a_{c_{k-1}} B + a_{c_k}) \bmod M$$

其中 BB 和 MM 是预先给定的参数。

输入格式

第一行输入包含整数 nn、kk、BB 和 MM——分别表示字母表中的字母数量、你感兴趣的单词数量和哈希参数(1≤k,n≤1051 \le k, n \le 10^5;k≤2n−1 k \le 2^n - 1;1≤B,M≤1061 \le B, M \le 10^6)。

第二行列出 nn 个整数 aia_i——每个字母的声音编号(1≤ai≤1051 \le a_i \le 10^5)。

输出格式

对于按字典序排列最小的 kk 个语言单词,依次输出它们发音的哈希值,每行一个。

2 3 1 5
1 2
1
3
2
3 4 2 3
1 3 1
1
1
0
2
5 6 23 1000
1 2 4 2 3
1
25
25
577
274
578

提示

在第一个样例中,单词的顺序为:1‾\overline{1}、1,2‾\overline{1,2}、2‾\overline{2}。

在第二个样例中,单词的发音为:1‾\overline{1}、1‾\overline{1}、1,3‾\overline{1,3}、1,3,1‾\overline{1,3,1}、3‾\overline{3}、3,1‾\overline{3,1}。


翻译由 DeepSeek V3 完成