设当前已经构造出的前缀中,每个小写字母出现了多少次。
对于位置 i,题目给出的 ai 表示:在位置 i 之前,和 si 相同的字符出现了 ai 次。
因此,在构造第 i 个字符时,只需要找到一个当前出现次数恰好为 ai 的小写字母,把它放在当前位置,然后将该字母的出现次数加 1。
使用贪心算法即可:
游游有一个长度为 n、仅由小写字母组成的字符串 s(下标从 1开始),以及一个长度为 n 的数组 {a1,a2,...,an}。
其中,ai 表示在位置 i 之前,字符 si 与 si相同的字符个数。
现在,字符串s 丢失了,只保留了数组 {ai}。请你根据给定的数组,重构任意一个满足条件的字符串 s;如果不存在任何满足条件的字符串,则输出 −1。
每个测试文件包含多组测试数据。第一行输入一个整数 T(1≤T≤104),代表数据组数。每组测试数据描述如下:
除此之外,保证单个测试文件的 n 之和不超过2×105。
对于每一组测试数据,新起一行:
输入
2
7
0 0 1 0 2 1 3
3
0 0 2
输出
abacaba
-1
说明
对于第一组,输出 "abacaba",其对应的数组为 {0,0,1,0,2,1,3},与输入一致;
对于第二组,在前 2 个位置中不存在出现次数为 2 的字符,因此 a3=2 无法满足,故无解,输出 −1
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.