CF1531E3.Сортировка слиянием
普及/提高-
通过率:0%
时间限制:1.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Рассмотрим следующий код сортировки слиянием на языке Python:
def sort(a): n = len(a) b = [0 for i in range(n)] log = [] def mergeSort(l, r): if r - l <= 1: return m = (l + r) >> 1 mergeSort(l, m) mergeSort(m, r) i, j, k = l, m, l while i < m and j < r: if a[i] < a[j]: log.append('0') b[k] = a[i] i += 1 else: log.append('1') b[k] = a[j] j += 1 k += 1 while i < m: b[k] = a[i] i += 1 k += 1 while j < r: b[k] = a[j] j += 1 k += 1 for p in range(l, r): a[p] = b[p] mergeSort(0, n) return "".join(log)
Как можно заметить, этот код использует логирование — важнейший инструмент разработки.
Старший разработчик ВКонтакте Вася сгенерировал перестановку a (массив из n различных целых чисел от 1 до n), дал её на вход функции sort и получил на выходе строку s. На следующий день строку s Вася нашёл, а перестановка a потерялась.
Вася хочет восстановить любую перестановку a такую, что вызов функции sort от неё даст ту же строку s. Помогите ему!
考虑以下用 Python 编写的归并排序代码:
def sort(a): n = len(a) b = [0 for i in range(n)] log = [] def mergeSort(l, r): if r - l <= 1: return m = (l + r) >> 1 mergeSort(l, m) mergeSort(m, r) i, j, k = l, m, l while i < m and j < r: if a[i] < a[j]: log.append('0') b[k] = a[i] i += 1 else: log.append('1') b[k] = a[j] j += 1 k += 1 while i < m: b[k] = a[i] i += 1 k += 1 while j < r: b[k] = a[j] j += 1 k += 1 for p in range(l, r): a[p] = b[p] mergeSort(0, n) return "".join(log)
可以注意到,该代码使用了日志记录——这是开发中至关重要的工具。
VK 的高级开发工程师瓦夏生成了一个排列 a(即一个由 1 到 n 的 n 个互不相同的整数组成的数组),将其作为输入传入函数 sort,并得到了输出字符串 s。第二天,瓦夏找到了字符串 s,但排列 a 却丢失了。
瓦夏希望恢复出任意一个排列 a,使得对该排列调用函数 sort 后能恰好得到相同的字符串 s。请帮助他!
输入格式
Ввод содержит непустую строку s, состоящую из символов 0 и 1.
В этой версии задачи для любого теста существует перестановка длины не более 105, удовлетворяющая условию. Тем не менее, ваш ответ может иметь любую длину, в том числе превышающую 105.
输入包含一个非空字符串 s,该字符串仅由字符 0 和 1 组成。
在本题版本中,对于任意测试用例,均存在一个长度不超过 105 的排列满足条件。然而,您的答案可以是任意长度,包括超过 105。
输出格式
В первой строке выведите целое число n — длину перестановки.
Во второй строке выведите n различных целых чисел a0,a1,…,an−1 (1≤ai≤n) — элементы перестановки.
Если существует несколько вариантов ответа, выведите любой из них.
第一行输出一个整数 n — 排列的长度。
第二行输出 n 个互不相同的整数 a0,a1,…,an−1(1≤ai≤n)— 排列的元素。
如果存在多个正确答案,输出其中任意一个即可。
输入输出样例
输入#1
00000000000000000000000000000000
输出#1
16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
输入#2
11111111111111111111111111111111
输出#2
16 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
输入#3
101011010001100100011011001111011000011110010
输出#3
16 13 6 1 7 12 5 4 15 14 16 10 11 3 8 9 2
输入解题思路,AI测评打分。不知道怎么写?