Задание EGEINF79DEC1: Обработка текстового файла

ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий

Открыть решение ↓ Ошибка или пожелание

Тип задачи: Обработка текстового файла.

Учебные темы: Обработка символьных данных. Встроенные функции языка программирования для обработки символьных строк. Алгоритмы обработки символьных строк: подсчёт количества появлений символа в строке, разбиение строки на слова по пробельным символам, поиск подстроки внутри данной строки, замена найденной подстроки на другую строку. Генерация всех слов в некотором алфавите, удовлетворяющих заданным ограничениям. Преобразование числа в символьную строку и обратно.

Впишите правильный ответ.

 Рисунок из условия ФИПИЗадание выполняется с использованием прилагаемых файлов.

 

Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита. Определите в прилагаемом файле максимальное количество идущих подряд символов, оканчивающихся подстрокой 2025, среди которых буква Y встречается не менее 140 раз, а подстрока 2025 содержится ровно 50 раз.

В ответе запишите число – количество символов в найденной последовательности.

Для выполнения этого задания следует написать программу.

Скачать файл задания (ZIP, ФИПИ)


i
СВОЙСТВА ЗАДАНИЯ
КЭС:
3.9 Обработка символьных данных. Встроенные функции языка программирования для обработки символьных строк. Алгоритмы обработки символьных строк: подсчёт количества появлений символа в строке, разбиение строки на слова по пробельным символам, поиск подстроки внутри данной строки, замена найденной подстроки на другую строку. Генерация всех слов в некотором алфавите, удовлетворяющих заданным ограничениям. Преобразование числа в символьную строку и обратно
Тип ответа:Краткий ответ
Номер: 79DEC1
НЕ РЕШЕНО Ответить

Решение задания EGEINF79DEC1

Ответ: 938

Решение.

Подходящий фрагмент обязан закончиться сразу после некоторого вхождения 2025. Переберём именно такие окончания. Для каждого из них нужны ровно 50 последних полных вхождений образца внутри фрагмента. У 2025 нет непустого собственного префикса, совпадающего с суффиксом, поэтому его вхождения не перекрываются.

Пусть текущее вхождение — пятидесятое или более позднее. Если перед последними 50 вхождениями есть ещё одно, его начало обозначим p. Самая ранняя разрешённая левая граница равна p + 1: так предыдущее вхождение уже не входит целиком, а все 50 следующих сохранены. Если предыдущего вхождения нет, начинаем с позиции 0. Нельзя отбрасывать весь предыдущий образец: его последние три символа разрешено оставить.

Этот самый длинный кандидат для выбранного окончания содержит не меньше букв Y, чем любой более короткий с тем же концом. Если в нём меньше 140 букв Y, сдвиг начала вправо не поможет. Если их не меньше 140, учитываем его длину. Такой выбор рассматривает оптимальный фрагмент для каждого возможного окончания.

Храним очередь из не более 51 пары: позиция начала очередного 2025 и число букв Y до этой позиции. При чтении строки обновляем общий счётчик Y. В самом образце буквы Y нет, поэтому к его концу счётчик остаётся тем же. Вычитание счётчика у исключённого предыдущего вхождения даёт число Y в выбранном фрагменте.

Проверка по исходному файлу: фрагмент на позициях 2936833–2937770 включительно, считая с 1, оканчивается на 2025. В нём 50 полных вхождений 2025 и 237 букв Y, то есть требуемые ограничения выполнены. Длина: 2937770 − 2936833 + 1 = 938.

Программа Python; переименуем извлечённый текстовый файл в data.txt либо укажем его исходное имя в open:

from collections import deque

with open("data.txt", encoding="utf-8-sig") as f:
    s = f.read().strip()
recent = deque(maxlen=51)
y_total = 0
best = 0
for i, ch in enumerate(s):
    if ch == "Y":
        y_total += 1
    if s.startswith("2025", i):
        recent.append((i, y_total))
        if len(recent) < 50:
            continue
        if len(recent) == 50:
            left = 0
            y_before = 0
        else:
            previous, y_before = recent[0]
            left = previous + 1
        if y_total - y_before >= 140:
            best = max(best, i + 4 - left)
print(best)

Программа проходит по строке за линейное время. Дополнительные счётчики и очередь ограниченной длины не растут с длиной файла. Независимый алгоритм по позициям символов и вхождений подтвердил максимум.

Ответ: 938.

Помочь улучшить сайт

Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF79DEC1.

Сообщение увидит только команда сайта: на странице оно не публикуется.

Комментарии к решению

Комментарии видны всем посетителям сайта.

Комментариев пока нет. Будьте первым.

Чтобы оставить комментарий, войдите или зарегистрируйтесь.