ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Обработка текстового файла.
| КЭС: | 3.9 Обработка символьных данных. Встроенные функции языка программирования для обработки символьных строк. Алгоритмы обработки символьных строк: подсчёт количества появлений символа в строке, разбиение строки на слова по пробельным символам, поиск подстроки внутри данной строки, замена найденной подстроки на другую строку. Генерация всех слов в некотором алфавите, удовлетворяющих заданным ограничениям. Преобразование числа в символьную строку и обратно |
| Тип ответа: | Краткий ответ |
Ответ: 2981
Решение.
В файле DEMO24.txt нужно найти самый длинный непрерывный фрагмент с ровно 80 буквами Y и не менее чем 90 вхождениями сочетания 2025. Обе проверки обязательны.
Разделим исходную строку по буквам Y. Получатся участки, внутри которых Y отсутствует. Пустые участки между соседними Y, а также пустые участки на краях сохраняем: они нужны для правильного подсчёта.
Любой максимальный фрагмент с заданными 80 последовательными Y состоит из 81 полного участка и 80 разделителей Y между ними. Его можно расширять внутри крайних участков до ближайшей внешней Y или края файла. Такое расширение не меняет число Y и не уменьшает количество 2025, поэтому искать более короткие части этих участков не требуется.
Для каждого участка запишем длину и количество 2025. Сочетание 2025 не может пересечь разделитель Y, поэтому число его вхождений в объединении равно сумме количеств в отдельных участках. У самого сочетания 2025 нет перекрывающихся вхождений: его собственные непустые начало и конец не совпадают. Поэтому метод count подходит.
Переберём окна из 81 соседнего участка. Длина окна равна сумме их длин плюс 80. Проверяем сумму количеств 2025; если она не меньше 90, обновляем максимум. При сдвиге окна вычитаем показатели ушедшего участка и прибавляем показатели нового.
Программа на Python 3:
Перед запуском сохраните скачанный файл под именем DEMO24.txt рядом с программой.
with open('DEMO_24.txt') as source:
parts = source.read().strip().split('Y')
lengths = [len(part) for part in parts]
patterns = [part.count('2025') for part in parts]
width = 81
best = 0
if len(parts) >= width:
total_length = sum(lengths[:width]) + 80
total_patterns = sum(patterns[:width])
for start in range(len(parts) - width + 1):
if start > 0:
old, new = start - 1, start + width - 1
total_length += lengths[new] - lengths[old]
total_patterns += patterns[new] - patterns[old]
if total_patterns >= 90:
best = max(best, total_length)
print(best)Результат — 2981. Проверка: один максимальный фрагмент занимает позиции 1763444–1766424 включительно, считая с единицы. Он содержит ровно 80 букв Y и 656 вхождений 2025, что не меньше 90. Его длина 1766424 − 1763444 + 1 = 2981.
Независимый посимвольный проход с движущимися границами подтвердил тот же максимум и те же границы. В проверку входят участки до первой и после последней Y: пропуск начального участка может потерять вхождения 2025. Обработка занимает O(L) времени и O(L) памяти, где L — длина файла.
Ответ: 2981.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFD6DFE2.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.