Теоретический материал
Решение состоит из нескольких частей (построение графа, поиск в нем пути и других), мы же только рассмотрим построение всех переходов по кнопке Alt (основная часть построения графа).
Далее для краткости изложения отождествим вершину бора и строку, ей соответствующую. Также будем понимать под циклической последовательностью следующую: 1, 2, …, N, 1, 2, …, N, 1, 2, …
Опишем решение задачи, пока не затрагивая реализацию. Пусть курсор находится на файле с номером k. Тогда переход по кнопке Alt и строке s — это ближайший после k-ого в циклической последовательности файл, имеющий строку s в качестве префикса своего имени. Для того чтобы рассмотреть все кратчайшие переходы, очевидно, достаточно в качестве строк s рассмотреть только строки, являющиеся префиксом имени хотя бы одного файла.
Попробуем использовать бор для реализации этого решения задачи. Сначала рассмотрим частный случай: построим переходы из первого файла. Еще раз поймем, какую функциональность мы хотим от модифицированного бора. Необходимо для каждой строки s знать номер первого файла, имеющего эту строку s в качестве префикса своего имени (это и будет тот файл, на который мы перейдем, нажав Alt и s). Поэтому, можно в каждой вершине бора завести поле first и добавлять все файлы (их имена) в порядке с первого по последний и при создании вершины в это поле записывать номер файла, который в тот момент добавлялся. (Так как при добавлении строки мы пройдем ровно те вершины, которым соответствуют префиксы этой строки.) Тогда, обойдя дерево (например, обходом в глубину), можно просмотреть все префиксы всех файлов и для каждого из них получить переход из первого файла в тот, который записан в поле first вершины этого префикса.
Но есть недостаток этой реализации: для каждой вершины строить заново бор слишком долго. Поэтому реализуем этот частный случай чуть по-другому (далее станет понятно, зачем). Будем идти по файлам в обратном порядке (с последнего по первый) и переписывать поле first каждый раз, когда проходим по вершине (при этом мы пройдем все префиксы имени файла). Несложно понять, что мы опять получили то же самое необходимое заполнение полей first.
Теперь посмотрим, что нужно сделать, чтобы перейти от построения переходов из первого файла к построению переходов из последнего. Для этого нужно было бы добавить файлы n–1, n–2, …, 2, 1, n. Но сравнивая это с тем, что у нас уже есть, получаем, что нужно просто еще раз добавить n-ый файл. И так далее…