Задание 24 · ЕГЭ, информатика 2027
Программа: символьная информация
Строка из 100 000 символов обрабатывается за один проход.
Пять вариантов задания
Данные в вариантах разные, приём решения один. Отмеченные галочкой уже решены — отметка хранится в этом браузере.
24.txt — переименуйте или поправьте строку с open(...).Прочитать строку
Файл содержит одну длинную строку. Читаем её и убираем перевод строки:s = open('24.txt').readline().strip(). Безstrip()невидимый символ «\n» попадёт в подсчёт.Выбрать способ
Это задача про «окно»: мы держим участок строки и следим, чтобы внутри было не больше 2 символов «A». Как только стало больше — подтягиваем левую границу вправо. Каждый символ проходит через окно ровно дважды, поэтому строка длиной 100 000 обрабатывается мгновенно.Не перебирать все подстроки
Подстрок у строки длиной 100 000 около пяти миллиардов — двойной цикл здесь не досчитает никогда. Задача решается ровно за один проход.Ответ
Получается 60.
Эталонная программа (Python)
Программа не исполняется на странице: задание проверяет умение написать её самому. Перенесите текст в свою среду и запустите там.
s = open('24.txt').readline().strip()
left = 0 # левая граница окна
cnt = 0 # сколько «A» сейчас внутри окна
best = 0
for right in range(len(s)):
if s[right] == 'A':
cnt += 1
# окно нарушило условие — двигаем левую границу
while cnt > 2:
if s[left] == 'A':
cnt -= 1
left += 1
if right - left + 1 > best:
best = right - left + 1
print(best)Где обычно теряют балл
- Забыть strip() и получить ответ, больший на единицу.
- Перебирать все пары границ подстроки — программа не успеет отработать за экзамен.
- Считать не длину участка, а количество символов «нужного» вида внутри него.
24.txt — переименуйте или поправьте строку с open(...).Прочитать строку
Файл содержит одну длинную строку. Читаем её и убираем перевод строки:s = open('24.txt').readline().strip(). Безstrip()невидимый символ «\n» попадёт в подсчёт.Выбрать способ
Достаточно одного прохода: пока соседние символы разные, цепочка растёт; как только встретились два одинаковых — текущая цепочка обрывается и счёт начинается с единицы.Не перебирать все подстроки
Подстрок у строки длиной 100 000 около пяти миллиардов — двойной цикл здесь не досчитает никогда. Задача решается ровно за один проход.Ответ
Получается 34.
Эталонная программа (Python)
Программа не исполняется на странице: задание проверяет умение написать её самому. Перенесите текст в свою среду и запустите там.
s = open('24.txt').readline().strip()
best = 1
cur = 1
for i in range(1, len(s)):
if s[i] != s[i - 1]:
cur += 1 # цепочка продолжается
else:
cur = 1 # два одинаковых подряд — начинаем заново
if cur > best:
best = cur
print(best)Где обычно теряют балл
- Забыть strip() и получить ответ, больший на единицу.
- Перебирать все пары границ подстроки — программа не успеет отработать за экзамен.
- Считать не длину участка, а количество символов «нужного» вида внутри него.
24.txt — переименуйте или поправьте строку с open(...).Прочитать строку
Файл содержит одну длинную строку. Читаем её и убираем перевод строки:s = open('24.txt').readline().strip(). Безstrip()невидимый символ «\n» попадёт в подсчёт.Выбрать способ
Символ «B» разрезает строку на куски. Нужен самый длинный кусок — считаем длину текущего и обнуляем счётчик на каждом запрещённом символе.Не перебирать все подстроки
Подстрок у строки длиной 100 000 около пяти миллиардов — двойной цикл здесь не досчитает никогда. Задача решается ровно за один проход.Ответ
Получается 36.
Эталонная программа (Python)
Программа не исполняется на странице: задание проверяет умение написать её самому. Перенесите текст в свою среду и запустите там.
s = open('24.txt').readline().strip()
best = 0
cur = 0
for c in s:
if c == 'B':
cur = 0 # запрещённый символ обрывает участок
else:
cur += 1
if cur > best:
best = cur
print(best)Где обычно теряют балл
- Забыть strip() и получить ответ, больший на единицу.
- Перебирать все пары границ подстроки — программа не успеет отработать за экзамен.
- Считать не длину участка, а количество символов «нужного» вида внутри него.
24.txt — переименуйте или поправьте строку с open(...).Прочитать строку
Файл содержит одну длинную строку. Читаем её и убираем перевод строки:s = open('24.txt').readline().strip(). Безstrip()невидимый символ «\n» попадёт в подсчёт.Выбрать способ
Снова «окно», но следим не за количеством одного символа, а за количеством РАЗЛИЧНЫХ символов внутри. Словарь считает, сколько каких букв в окне; когда счётчик буквы падает до нуля, её нужно удалить из словаря — иначе len(cnt) будет врать.Не перебирать все подстроки
Подстрок у строки длиной 100 000 около пяти миллиардов — двойной цикл здесь не досчитает никогда. Задача решается ровно за один проход.Ответ
Получается 42.
Эталонная программа (Python)
Программа не исполняется на странице: задание проверяет умение написать её самому. Перенесите текст в свою среду и запустите там.
s = open('24.txt').readline().strip()
from collections import defaultdict
cnt = defaultdict(int) # сколько каких символов в окне
left = 0
best = 0
for right in range(len(s)):
cnt[s[right]] += 1
while len(cnt) > 3: # различных стало слишком много
cnt[s[left]] -= 1
if cnt[s[left]] == 0:
del cnt[s[left]]
left += 1
if right - left + 1 > best:
best = right - left + 1
print(best)Где обычно теряют балл
- Забыть strip() и получить ответ, больший на единицу.
- Перебирать все пары границ подстроки — программа не успеет отработать за экзамен.
- Считать не длину участка, а количество символов «нужного» вида внутри него.
24.txt — переименуйте или поправьте строку с open(...).Прочитать строку
Файл содержит одну длинную строку. Читаем её и убираем перевод строки:s = open('24.txt').readline().strip(). Безstrip()невидимый символ «\n» попадёт в подсчёт.Выбрать способ
Тот же приём с окном: правая граница идёт вперёд всегда, левая подтягивается только когда условие нарушено.Не перебирать все подстроки
Подстрок у строки длиной 100 000 около пяти миллиардов — двойной цикл здесь не досчитает никогда. Задача решается ровно за один проход.Ответ
Получается 42.
Эталонная программа (Python)
Программа не исполняется на странице: задание проверяет умение написать её самому. Перенесите текст в свою среду и запустите там.
s = open('24.txt').readline().strip()
left = 0
cnt = 0
best = 0
for right in range(len(s)):
if s[right] == 'C':
cnt += 1
while cnt > 1:
if s[left] == 'C':
cnt -= 1
left += 1
if right - left + 1 > best:
best = right - left + 1
print(best)Где обычно теряют балл
- Забыть strip() и получить ответ, больший на единицу.
- Перебирать все пары границ подстроки — программа не успеет отработать за экзамен.
- Считать не длину участка, а количество символов «нужного» вида внутри него.
Обработка символьной строки
Строка длиной 100 000 символов. Перебирать все подстроки нельзя — их около пяти миллиардов. Все задания этого номера решаются за один проход.
Два рабочих приёма:
- Счётчик текущей цепочки. Идём по строке и держим длину подходящего участка: условие выполняется — увеличиваем, нарушилось — сбрасываем в ноль или единицу.
- Скользящее окно. Правая граница всегда движется вперёд, а левая подтягивается только тогда, когда условие нарушено. Каждый символ проходит через окно дважды, поэтому время линейное.
Читать файл нужно с strip() — иначе невидимый перевод
строки попадёт в подсчёт.
Где теряют балл. Двойной цикл по границам подстроки; забытый
strip(); путаница между длиной участка и количеством
«нужных» символов в нём.
Где эта тема разобрана подробно
Структура раздела и темы заданий соответствуют кодификатору и спецификации ФИПИ. Задания и файлы данных составлены редакцией reknow.ru. План варианта приведён по проекту спецификации и демоверсии ФИПИ 2027 года. После публикации утверждённой версии информация будет обновлена.