Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Перетряхивание массивов, оптимизация

Автор: Bill Gates 25.05.2006 23:27

ФАЙЛОВЫЙ МЕНЕДЖЕР
Имя входного файла: far.in
Имя выходного файла: far.out
Петя работает над очень большим проектом. Проект содержит N файлов. В процессе работы Пете часто приходится просматривать и редактировать файлы. Для ускорения работы Петя использует файловый менеджер FAR Menager, который отбражает список имен файлов проекта в некотором порядке.
В текущей версии FAR Manager'а для перемещения по списку имен файлов есть следующие возможности:
1) Можно нажать клавишу "вниз", при этом курсор перемещается на следующий файл в списке. Для последнего файла в списке следующим считается первый.
2) Можно нажать клавишу "вверх", при этом курсор перемещается на предыдущий файл в списке, для первого файла предыдущим считается последний.
3) Можно нажать клавишу "Alt" и, удерживая ее, набрать последовательность латинских букв. После этого клавишу "Alt" следует отпустить, и в этот момент курсор переместится на ближайший файл, имя которого начинается с заданной последовательности символов. Ближайший файл - это файл, на который можно переместиться за наименьшее количество нажатий клавиши "вниз". Если заданная последовательность является началом имени текущего файла, или файла, имя которого начинается с этой последовательности, не существует, то курсор остается на месте.
Первая и вторая из описанных возможностей файлового менеджера требуют по одному нажатию на клавиши, а третья - одного клавиши "Alt" плюс нажатий, равное длине набранной последовательности латинских букв.
Файлы пронумерованы от 1 до N в порядке их следования. После загрузки FAR Manager'а курсор находится на первом файле.
Петя знает, что ему придется редактировать файл с номером a[1], затем с номером a[2] и так далее, а последним - файл с номером a[k]. В последовательности a[1], a[2], ..., a[k] один и тот же номер может встечаться несколько раз. При каждом перемещении от одного файла к другому Петя хочет нажимать как можно меньше клавиш.
Требуется написать программу, которая выдает искомую последовательность нажатий клавиш.

ФОРМАТ ВХОДНЫХ ДАННЫХ
В первой строке входного файла записано целое число N (1 <= N <= 1000) - количество файлов в проекте.
В следующих N строках записаны имена файлов, по одному в каждой строке. Файлы перечеслены в том порядке, в котором они отображаются файловым менеджером. Имена состоят только из строчных латинских букв. Длина каждого имени не превосходит 2000 символов. Все имена файлов различны.
Далее в следующей строке записано целое число k (1 <= k <= 10).
Последняя строка входного файла содержит k целых чисел a[1], a[2], ..., a[k] (1 <= a <= N) - номера редактируемых файлов. Редактирование файлов выполняется в том порядке, в котором они встречаются в последовательности a[1], a[2], ..., a[k].

ФОРМАТ ВЫХОДНЫХ ДАННЫХ
Выходной файл должен содержать описание искомой последовательности нажатий клавиш в виде k блоков информации:
* Первый блок информации описывает перемещение от файла с номером a[1] к файлу с номером a[2].
* Второй блок информации описывает перемещение от файла с номером a[2] к файлу с номером a[2].
* ...
* k-ый блок информации описывает перемещение от файла с номером a[k-1] к файлу с номером a[k].
Каждый блок информации выглядит следующим образом.
В первой строке блока записывается число L - наименьшее количество нажатий клвиш, необходимое для перемещения от очередного файла последовательности к следующему.
Следующие L строк блока описывают нажаимаемые клавиши. Каждая из строк содержит описание одной клавиши:
* Если нажимается клавиша "вниз", то в строке записывается слово down
* Если нажимается клавиша "вверх", то в строке записывается слово up
* Если нажимается клавиша "Alt", то в строке записывается слово Alt
* При нажатии клавиши с латинской буквой выводится соответсвующая ей латинская буква
Если существует несколько оптимальных вариантов перемещения, то требуется вывести любой из них.

ПРИМЕРЫ
========== ==========
far.in far.out
========== ==========
6 1
submit up
monitor 3
monitorx Alt
monyator m
subversion down
sub 0
5 2
6 3 3 5 2 down
down
2
Alt
m
========== ==========
8 3
abc Alt
abv a
abba u
test 2
auvto down
ioi down
olympiad
2
4 6
========== ==========