Это задача с двойным запуском. Ваше решение будет запущено два раза.
Вам необходимо написать программу, которая передает данные по ненадежному каналу связи. На одном конце провода (во время первого запуска) вы получаете двоичную строку длины $$$n$$$, и должны уметь восстановить ее на другом конце провода (во время второго запуска).
К счастью, канал связи позволяет посылать строку с $$$k$$$ различными типами символов ($$$k \gt 2$$$) и использовать строки длины $$$m$$$ ($$$m \gt n$$$). Однако, в результате передачи строки по этому каналу, все вхождения какого-то из $$$k$$$ типов символов будут удалены. Оставшиеся символы строки будут идти в том же порядке, как и раньше. Ваша задача состоит в том, чтобы придумать схему кодирования, позволяющую восстановить исходную строку во время второго запуска.
Для ускорения тестирования в одном тесте вам предстоит закодировать и передать сразу $$$t$$$ строк. Удаление символов в этих строках будет независимым, в разных строчках могут быть удалены разные символы.
При первом запуске на первой строке ввода находится число $$$1$$$. Следующая строка содержит целые числа $$$t$$$, $$$n$$$, $$$m$$$ и $$$k$$$ — число строк, которые необходимо закодировать, длина каждой из них, разрешенная длина строки, которую можно вывести, и число различных символов, которые можно использовать ($$$1 \le t \le 100$$$, $$$k = 3$$$ или $$$k = 4$$$).
Каждая из следующих $$$t$$$ строк содержит строку длины $$$n$$$ из нулей и единиц.
Если $$$k = 4$$$, то вы можете использовать для кодирования символы A, B, C, D. Если $$$k = 3$$$, то вы можете использовать только A, B и C.
При втором запуске на первой строке ввода находится число $$$2$$$. Вторая строка также содержит целые числа $$$t$$$, $$$n$$$, $$$m$$$ и $$$k$$$, такие же, как и в первом запуске. Далее следуют $$$t$$$ строк, которые вывела ваша программа в первом запуске, но в каждой строке были удалены все символы какого-то одного типа. Строки, подающиеся на вход вашей программе во втором запуске, будут идти в том же порядке, как и в первом запуске.
В первом запуске вам необходимо вывести $$$t$$$ непустых строк. Каждая из должна состоять из не более, чем $$$m$$$ символов из алфавита { A, B, C, D } или { A, B, C }, в зависимости от текущего $$$k$$$.
Символ для удаления будет выбран так, чтобы строка не стала пустой, например, в строке CCCC для удаления не будет выбран символ C.
При втором запуске раскодируйте все $$$t$$$ строк и выведите исходные двоичные строки длины $$$n$$$.
| {Баллы} | {Ограничения} | |
| 1 | 27 | $$$t = 1$$$, $$$n = 10$$$, $$$k = 4$$$, $$$m = 20$$$ |
| 2 | 14 | $$$t = 100$$$, $$$n = 100$$$, $$$k = 4$$$, $$$m = 200$$$ |
| 3 | 28 | $$$t = 100$$$, $$$n = 100$$$, $$$k = 3$$$, $$$m = 200$$$ |
| 4 | 20 | $$$t = 100$$$, $$$n = 100$$$, $$$k = 3$$$, $$$m = 190$$$ |
| 5 | 11 | $$$t = 100$$$, $$$n = 100$$$, $$$k = 3$$$, $$$m = 180$$$ |
1
2 10 20 4
0111011001
1111111110
BAACBBACDCDDAACCAABD
DABBADCBCBBCCACA
2
2 10 20 4
AACACDCDDAACCAAD
DBBDCBCBBCCC
0111011001
1111111110
В примере необходимо передать две строки: 0111011001 и 1111111110, используя строки длины $$$m = 20$$$ и $$$k = 4$$$ типа символов. Предположим, что в первом запуске программа вывела BAACBBACDCDDAACCAABD для первой строки и DABBADCBCBBCCACA для второй строки.
Перед вторым запуском программа жюри удалит один тип символов из каждой строки. Для примера, в первой строчке удалили все буквы B, а во второй — все буквы A. По этим данным необходимо восстановить изначальные двоичные строки 0111011001 и 1111111110.