Статья Автор: Лебедев Дмитрий Алексеевич

24_КЕГЭ_апрель _ метод КА (или почти МТ)

Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита. Определите в прилагаемом файле минимальное количество идущих подряд символов, среди которых пара символов «20» (в указанном порядке) встречается ровно 26 раз, гласная буква встречается ровно один раз, искомая последовательность заканчивается этой единственной гласной буквой. В ответе запишите число — количество символов в найденной последовательности.

Примечание. гласные буквы латинского алфавита: A, E, I, O, U, Y.


Задачу можно решить методом замен (меняем 20, гласные и остальные) - задача сводится к последовательности из трех знаков.
Спилитуем по одному из знаков, далее в каждом фрагменте находим нужную подпоследовательность.
Это логичный способ, но его недостаток в том, что к результату надо "что-то" добавлять и нельзя посмотреть на саму последовательность 
(то есть, если вопрос немного усложнить - например, вывести "слитную" подпоследовательность согласных внутри найденного, то будут сложности)
Попробуем использовать метод конечных автоматов (некоторое обобщение Машины Тьюринга) с двумя состояниями:
  • 0 - поиск гласной (начальное)
  • 1 - обработка фрагмента
Перебор осуществляем циклом по всей строке (начинаем с первой позиции, чтобы можно было проверять биграмму)
В состоянии 0:
  • если встречаем '20', то в список мест добавляем начало биграммы
  • если встречаем "Гласную", переходим в состояние 1
В состоянии 1 (в теле цикла после состояния 0 через if, то есть МТ как-бы остается на месте)
  • проверяем достаточность пар (то есть длину списка мест) 
  • если достаточно то вычисляем начало, сравниваем с результатом и, при необходимости сохраняем
    - в результат записываем длину фрагмента и индексы его границ
  • сбрасываем счетчик мест (делаем пустым)
  • переходим в состояние 0
По завершении работы:
  • выводим результат
  • фрагмент, на котором получен результат (для визуального контроля)
Конечно, можно обойтись и без выделения состояний, то так более понятен смысл алгоритма и его связь с МТ
Фактически используем пару состояний, алфавит из трех символов ( "20", "гласная", "все остальное"). 
Задачу решаем в один проход, видим полноценный результат, который может быть обработан дальше.

Ниже код программы с комментариями


Конечно, можно заметить, что состояния в этой задаче особо не нужны. 
Ниже приведен более компактный код



В варианте 2 - последовательность должна начинаться с гласной буквы.
Что надо изменить в алгоритме (вариант - развернуть и искать 02 вместо 20 не рассматривается)

Attached files
24_v0.txt
24_v1.txt
24_v2.txt
Печать