eolymp
bolt
Попробуйте наш новый интерфейс для отправки задач
Задачи

Восстановление последовательности

Восстановление последовательности

Сортировка слиянием является одним из классических алгоритмов сортировки. Он делит входной массив на две части, рекурсивно сортирует каждую из них отдельно и затем сливает две отсотированные части вместе. В этой задаче алгоритм сортировки слиянием сортирует массив целых чисел в возрастающем порядке. Точное описание алгоритма приведем на псевдокоде: function merge_sort(arr): n = arr.length() if n <= 1: return arr // arr is indexed 0 through n-1, inclusive mid = floor(n/2) first_half = merge_sort(arr\[0..mid-1\]) second_half = merge_sort(arr\[mid..n-1\]) return merge(first_half, second_half) function merge(arr1, arr2): result = \[\] while arr1.length() > 0 and arr2.length() > 0: if arr1\[0\] < arr2\[0\]: print '1' // for debugging result.append(arr1\[0\]) arr1.remove_first() else: print '2' // for debugging result.append(arr2\[0\]) arr2.remove_first() result.append(arr1) result.append(arr2) return result Очень важная перестановка чисел от \textbf{1} до \textbf{n} была утеряна из-за порчи жесткого диска. К счастью, последовательность сортировалась выше приведенным алгоритмом и отладочная информация из единиц (\textbf{1}) и двоек (\textbf{2}) была записана на другой диск. По длине входной последовательности \textbf{n} и отладочной информации следует восстановить исходную последовательность целых чисел. \InputFile Первая строка содержит количество тестов \textbf{t}. Каждый тест состоит из двух строк. Первая строка теста содержит длину исходной последовательности \textbf{n} (\textbf{2} ≤ \textbf{n} ≤ \textbf{10000}). Вторая строка содержит последовательность символов \textbf{1} и \textbf{2} - отладочную информацию программы сортировки слияниям исходной последовательности. Строки разделяются символом "\textbf{\textbackslash n}". \OutputFile Чтобы не выводить всю последовательность, следует вычислить и напечатать только ее контрольную сумму, которая вычисляется по следующему алгоритму: function checksum(arr): result = 1 for i=0 to arr.length()-1: result = (31 * result + arr\[i\]) mod 1000003 return result \textbf{Примеры} В первом примере \textbf{n} равно \textbf{2}, отладочная последовательность \textbf{1}. Исходной была последовательность \textbf{1} \textbf{2} или \textbf{2} \textbf{1}. Отладочная информация сообщает нам, что первое число последовательности было меньше второго, поэтому исходной последовательностью будет \textbf{1} \textbf{2}. Ее контрольная сумма равна \textbf{994}. Во втором примере \textbf{n} равно \textbf{2}, отладочная последовательность \textbf{2}. На этот раз исходной будет последовательность \textbf{2 1}. В третьем примере \textbf{n} равно \textbf{4}, отладочная последовательность \textbf{12212}. Исходная последовательность равна \textbf{2} \textbf{4} \textbf{3} \textbf{1}.
Лимит времени 1 секунда
Лимит использования памяти 64 MiB
Входные данные #1
5
2
1
2
2
4
12212
5
1122211
10
121221212111122121212
Выходные данные #1
Case #1: 994
Case #2: 1024
Case #3: 987041
Case #4: 570316
Case #5: 940812
Источник Facebook Hacker Cup 2012 Round 1