В 2025 году в ЕГЭ по информатике появилась новая формулировка задачи 24, которая требует не просто перебора, а анализа всех возможных подстрок фиксированной длины.
Условие звучит так:
Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита.
Определите в прилагаемом файле максимальное количество идущих подряд символов, среди которых подстрока 2025 встречается не менее 90 раз и при этом содержится ровно 80 букв Y.
В ответе запишите число — количество символов в найденной последовательности.
Это это задача на двойной цикл: перебор всех возможных отрезков текста и проверка условия.
📌 Суть метода двойного цикла
Метод двойного цикла — это прямой перебор всех подстрок текста:
- внешний цикл — начало подстроки (l),
- внутренний цикл — конец подстроки (r),
- для каждой пары (l, r) мы извлекаем подстроку s[l:r+1],
- и проверяем два условия:подстрока.count('2025') >= 90,
подстрока.count('Y') == 80.
Если оба выполнены — запоминаем длину r - l + 1, и ищем максимум.
Этот метод:
- прост в понимании,
- гарантирует полный перебор,
- двойной цикл с оптимизацией break проходит за секунды).
💻 Код решения
🔹 Шаг 1: чтение файла
s = open('24_23281.txt').readline()
Что делает: читает весь файл в одну строку s.
Файл 24_23281.txt — текстовый, содержит только цифры и заглавные буквы (включая Y).
readline() — безопасно, потому что файл состоит из одной строки.
🔹 Шаг 2: инициализация максимума
m = 0
Что делает: переменная m хранит текущую максимальную длину подходящей подстроки.
Начинаем с 0 — если не найдётся ни одной подходящей подстроки, ответ будет 0 (но в задаче он есть).
🔹 Шаг 3: внешний цикл — начало подстроки
for l in range(0, len(s)):
Что делает: перебирает все возможные позиции начала подстроки — от 0 до конца строки.
l — индекс левого края подстроки.
Запись на занятия здесь: https://t.me/nka39
🔹 Шаг 4: внутренний цикл — конец подстроки
for r in range(l + m, len(s)):
Что делает: перебирает позиции конца подстроки — но не с l, а с l + m.
Это ключевая оптимизация: если уже найдена подстрока длины m, то нам неинтересны подстроки короче m,
поэтому начинаем с r = l + m, чтобы сразу рассматривать только потенциально лучшие варианты.
✅ Без этого — время работы растёт
🔹 Шаг 5: извлечение подстроки
c = s[l:r+1]
Что делает: берёт подстроку от l до r включительно.
В Python срез s[l:r+1] — это символы с индексами l, l+1, ..., r.
🔹 Шаг 6: проверка условия на Y
if c.count('Y') > 80:
break
Что делает: если в текущей подстроке уже больше 80 букв Y, то расширение подстроки вправо только увеличит их количество (мы добавляем символы справа, и Y не исчезнет).
Значит, для этого l дальнейшие r уже не дадут решения — можно прервать внутренний цикл.
⚠️ Это — главная оптимизация, делающая задачу решаемой на экзамене.
🔹 Шаг 7: проверка основного условия
elif c.count('2025') >= 90 and c.count('Y') == 80:
m = max(m, len(c))
Что делает: c.count('2025') >= 90 — подстрока содержит не менее 90 вхождений 2025, c.count('Y') == 80 — ровно 80 букв Y,
если оба условия выполнены — обновляем m на максимум между текущим m и длиной подстроки len(c).
✅ Обратите внимание: используется elif, а не if — потому что если Y > 80, мы уже вышли через break.
Значит, здесь Y ≤ 80, и мы проверяем точное равенство.
🔹 Шаг 8: вывод результата
print(m)
Выводит максимальную длину подходящей подстроки.
🧮 Как работает алгоритм на практике?
Представьте, что в тексте есть участок длиной 1200 символов, где:
- 2025 встречается 92 раза,
- Y — ровно 80 раз.
Алгоритм:
- При l = 100 начинает расширять подстроку.
- При r = 1299 получает c = s[100:1300].
- Проверяет: c.count('Y') = 80, c.count('2025') = 92 → условие выполнено.
- Обновляет m = 1200.
- Дальше для этого l r начинается с 100 + 1200 = 1300, и при r = 1300 уже c.count('Y') > 80 → break.
Для других l — либо Y набирается быстрее, либо 2025 не достигает 90.
Итог: m = 1200 — ответ.
✅ Почему этот метод правилен?
- Он перебирает все возможные подстроки, но с двумя оптимизациями:
r начинается с l + m — пропускаем заведомо короткие,
break при Y > 80 — пропускаем заведомо неподходящие продолжения.
- Условия проверяются точно: count('2025') и count('Y') — встроенные методы Python, работающие за линейное время от длины подстроки, но благодаря break общее время остаётся приемлемым.
📌 Итог
Hешение — это классический двойной цикл с двумя ключевыми оптимизациями, который:
- гарантирует нахождение глобального максимума,
- работает за разумное время на экзамене,
- легко понимается и воспроизводится.
Оно полностью соответствует условию задачи и является эталонным для этого прототипа.
➕ Есть и другие прототипы задачи 24
Этот вариант — один из нескольких.
В других могут быть:
- поиск подстрок с фиксированным количеством различных символов,
- анализ последовательностей с ограничением на частоту,
- использование скользящего окна вместо двойного цикла.
О них — в следующих материалах.
Если Вам информация была для Вас полезна, то можно поддержать автора, нажав на кнопку "Поддержать".
Подпишитесь на канал и научитесь решать все задания ЕГЭ по информатике!
Удачи на экзамене!
Записаться ко мне на занятия можно тут https://t.me/nka39