| 题目名称 | 4243. KMP |
|---|---|
| 输入输出 | kmpp.in/out |
| 难度等级 | ★★☆ |
| 时间限制 | 1000 ms (1 s) |
| 内存限制 | 512 MiB |
| 测试数据 | 10 |
| 题目来源 |
|
| 开放分组 | 全部用户 |
| 提交状态 | |
| 分类标签 | |
| 分享题解 |
| 通过:5, 提交:16, 通过率:31.25% | ||||
|
|
100 | 0.853 s | 9.72 MiB | C++ |
|
|
100 | 1.068 s | 9.71 MiB | C++ |
|
|
100 | 1.138 s | 27.94 MiB | C++ |
|
|
100 | 1.191 s | 9.73 MiB | C++ |
|
|
100 | 1.327 s | 9.72 MiB | C++ |
|
|
90 | 0.831 s | 4.93 MiB | C++ |
|
|
90 | 0.837 s | 4.90 MiB | C++ |
|
|
90 | 0.837 s | 4.92 MiB | C++ |
|
|
90 | 0.844 s | 4.92 MiB | C++ |
|
|
90 | 0.850 s | 4.88 MiB | C++ |
| 本题关联比赛 | |||
| 2026.1.3 | |||
| 关于 KMP 的近10条评论(全部评论) |
|---|
SAI社的Giftia记忆数据系统中,每台Giftia的核心记忆序列会生成对应的「记忆关联索引数组」(对应KMP的next数组)。某次量子记忆扰动事故后,一台Giftia的核心记忆字符串丢失,仅残留了该「记忆关联索引数组」。你需要根据这份残留的数组,还原出唯一的核心记忆字符串。
给定一个长度为 $n$ 的整数序列 $idx[1 \dots n]$(记忆关联索引数组),其中 $idx[i]$ 表示Giftia核心记忆字符串 $S$ 的前 $i$ 个字符构成的记忆片段中,最长的相等真前后缀的长度(即记忆片段的重复关联程度,对应标准KMP的next数组定义)。
任务:
1. 构造一个长度为 $n$ 的小写字母字符串 $S$(Giftia的核心记忆字符串),使其记忆关联索引数组恰好为给定的序列;
2. 在满足上述条件的前提下,要求 $S$ 的字典序最小(保证记忆数据的基础排序符合SAI社的存储规范);
3. 如果给定的序列本身是不合法的(不存在任何记忆字符串能生成这个索引数组),输出 Impossible(表示该Giftia的记忆数据已无法还原)。
第一行输入一个整数 $n$,表示记忆关联索引数组的长度;
第二行输入 $n$ 个整数,依次为 $idx[1], idx[2], \dots, idx[n]$。
若给定的 $idx$ 数组合法,输出一行仅包含小写字母的字符串 $S$(字典序最小的Giftia核心记忆字符串);否则输出一行字符串 Impossible。
5 0 0 1 2 0
ababb
字符串 "ababb" 作为Giftia的核心记忆序列,其记忆关联索引数组为 [0,0,1,2,0],且是满足条件的字典序最小字符串。
3 0 1 2
aaa
字符串 "aaa" 作为Giftia的核心记忆序列,其记忆关联索引数组为 [0,1,2],是字典序最小的合法字符串。
4 0 2 1 0
Impossible
不存在任何Giftia核心记忆字符串的记忆关联索引数组为 [0,2,1,0],因此该Giftia的记忆数据已无法还原,输出 Impossible。
$1 \le n \le 10^6$
To_Carpe_Diem