ЕГЭ
Информатика
6 марта 2026
19 минут чтения

Задание 24 ЕГЭ по информатике: обработка символьной информации и метод скользящего окна

Задание 24 ЕГЭ по информатике (КЕГЭ) проверяет умение создавать собственные программы (10–20 строк) для обработки символьной информации — так дословно формулирует его ФИПИ. Это задание высокого уровня сложности, за него дают 1 первичный балл, к заданию обязательно прилагается файл `*.txt` с текстом из ограниченного набора букв и (или) цифр — обычно от миллиона до десяти миллионов символов в одну строку, — а на экзамене нужна среда программирования (C#, C++, Pascal, Java или Python). Ответ — одно число. По обобщённому плану ФИПИ на задание отводится 18 минут, и это не случайная щедрость: без программы такой файл не обработать даже за сутки, а с правильным алгоритмом ответ считается за секунды. В статье — рабочий шаблон чтения файла на Python, универсальный каркас «скользящего окна» (счётчик текущей длины плюс обновление максимума, со сбросом при нарушении условия), разбор того, как формально записать условие «буква не стоит рядом с буквой, а цифра — рядом с цифрой», и честная оценка, почему перебор всех подстрок файла здесь физически неосуществим. Дальше — три реальных задания из открытого банка ФИПИ, разобранные и проверенные программой, и типичные ошибки. Потренироваться можно на реальных заданиях 24 ЕГЭ по информатике онлайн — с мгновенной проверкой ответа.


Что проверяет задание 24 ЕГЭ по информатике

Задание 24 стоит в разделе кодификатора «Алгоритмы и программирование», элемент содержания 3.9, проверяемое требование — 2.11. По формулировке ФИПИ задание проверяет умение «создавать собственные программы (10–20 строк) для обработки символьной информации». В отличие от задания 17 (числовая последовательность) или задания 25 (тоже числа), на входе здесь всегда строка: файл, состоящий из ограниченного набора символов — букв, цифр или их смеси, — без пробелов и других разделителей.

Проверяемые умения (КЭС 3.9, требование 2.11):

  • открывать файл и читать его содержимое как одну строку, аккуратно избавляясь от завершающего символа переноса строки;
  • определять «тип» или принадлежность каждого символа заданному классу (буква или цифра, гласная или согласная, конкретный символ) — именно это, а не сами буквы, обычно и есть суть условия;
  • организовать один проход по строке с накоплением счётчика текущей длины подходящего участка и обновлением максимума;
  • корректно сбрасывать счётчик ровно в той точке, где условие нарушается, — не раньше и не позже;
  • оценивать порядок числа операций и понимать, почему решение без единственного прохода (перебор всех подстрок) не уложится в разумное время;
  • записать в ответ одно число — в зависимости от формулировки это длина найденного максимального участка либо количество пар символов, из которых он состоит.

Проекты КИМ-2027 ФИПИ публикует в конце августа 2026 года, но структура и содержание работы не менялись с 2025 года, поэтому все цифры ниже приведены по актуальной спецификации ФИПИ 2026 года.

ПараметрЗначение
Максимальный балл1 первичный. Частичного зачёта нет: ответ либо полностью совпадает с эталоном, либо 0 баллов
Уровень сложностиВысокий (В) — одно из пяти заданий высокого уровня во всей работе (21, 24, 25, 26, 27)
Форма ответаКраткая: одно число
Раздел кодификатора3. Алгоритмы и программирование; КЭС 3.9; требование 2.11
ФайлПрилагается: текстовый файл `*.txt`, обычно одна строка из букв и (или) цифр без разделителей
Специализированное ПОТребуется среда программирования (C#, C++, Pascal, Java или Python)
Рекомендуемое время18 минут (по обобщённому плану ФИПИ)
Связанные заданияЗадание 17 (тоже файл `*.txt` и своя программа, но числовая последовательность, КЭС 3.10, уровень повышенный), задание 23 (тот же код требования 2.11, но нужно проанализировать уже готовый алгоритм, а не написать свой), задание 26 (обработка данных из файла с сортировкой, тоже высокий уровень, но 2 балла и есть частичный зачёт)

Ответ — всего одно число, и оно либо верно целиком, либо нет. Частичного зачёта на задании 24 нет: он есть только на заданиях 26 и 27. Если ваша программа ошиблась на единицу — из-за границы окна, забытого символа переноса строки или неверной инициализации максимума, — балл не засчитывается полностью, а не наполовину.

Пишите и проверяйте программы на реальных данных

Задания ЕГЭ по информатике из открытого банка ФИПИ с прикреплёнными файлами и мгновенной проверкой ответа — на Repet.ai.

Открыть тренажёр

Как выглядит формулировка задания 24

Формулировка задания 24 почти всегда начинается одинаково: «Текстовый файл состоит из символов …» — дальше идёт конкретный алфавит (буквы, цифры или их смесь) и условие на участок, который нужно найти. Вот формулировки из реальных заданий открытого банка ФИПИ:

  • «Текстовый файл состоит из заглавных букв латинского алфавита Q, R, W и цифр 1, 2, 4. Определите в прилагаемом файле максимальное количество идущих подряд символов, среди которых ни одна буква не стоит рядом с буквой, а цифра — с цифрой.»
  • «Текстовый файл состоит из символов A, C, D, F и O. Определите максимальное количество идущих подряд пар символов вида согласная + гласная в прилагаемом файле.»
  • «Текстовый файл состоит из символов P, Q, R и S. Определите максимальное количество идущих подряд символов, среди которых нет идущих подряд символов P.»
  • «Текстовый файл состоит не более чем из 10⁶ символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны.»
  • «Текстовый файл состоит не более чем из 10⁶ символов X, Y и Z. Определите максимальное количество идущих подряд символов, символ Z встречается не более одного раза.»
  • «Текстовый файл состоит не более чем из 10⁶ символов X, Y и Z. Определите максимальное количество идущих подряд символов, расположенных в обратном алфавитном порядке (возможно, с повторением символов).»

Все формулировки заканчиваются одной и той же фразой: «Для выполнения этого задания следует написать программу». Это не вежливая рекомендация, а часть условия — без программы задачу на файле из миллиона с лишним символов не решить.

Как записывается ответ. Ответ на задание 24 — одно число, без пробелов и других символов. Здесь нет привычных для линий 17 или 18 «двух ячеек» — только одно значение. Но само это число означает разное в зависимости от формулировки: почти всегда это длина найденного участка (число символов), но во втором примере выше явно сказано «количество идущих подряд пар» — и тогда в ответ идёт число пар, а не число символов (у пары — два символа, так что итоговый участок длиннее вдвое). Последнее предложение условия стоит перечитать дважды, прежде чем писать print(...) — перепутать «символы» и «пары» очень легко, а эталон ФИПИ считает именно то, что написано в вопросе.

Как решать задание 24: теория и рабочие шаблоны

Как прочитать файл на Python — и почему не input()

Файл `*.txt` в задании 24 — это, как правило, одна очень длинная строка: миллион, а иногда десять миллионов символов подряд, без пробелов и переносов внутри самого текста. Рабочий шаблон чтения такой:

s = open('24.txt').readline().strip()

readline() читает первую (и единственную) строку файла целиком, вместе с завершающим её символом переноса строки (\n), если он в файле есть — а во многих файлах банка ФИПИ он действительно есть. strip() убирает этот символ и любые пробельные символы по краям. Поскольку в файле всего одна строка, readline() и read() здесь дают одинаковый результат — какой из двух методов использовать, дело вкуса, лишь бы не забыть strip().

Использовать input() здесь нельзя в принципе: эта функция читает одну строку с клавиатуры (со стандартного ввода), а не из файла на диске. Данные задания 24 лежат в приложенном файле — их нужно открыть по имени функцией open(), а не ждать, пока их наберут на клавиатуре. Программа с input() вместо чтения файла на экзамене просто зависнет в ожидании ввода и не даст никакого ответа.

Сразу после чтения полезно проверить, что файл прочитан целиком и в нужном формате: print(len(s), s[:20], s[-20:]). Длина должна совпадать с тем, что написано в условии («не более чем из 10⁶ символов» и т. п.), а первые и последние символы — принадлежать заявленному алфавиту.

Скользящее окно: счётчик длины плюс обновление максимума

Почти все подтипы задания 24 сводятся к одному и тому же каркасу — методу скользящего окна (его же называют методом одного прохода). Идея: пройти по строке один раз слева направо, поддерживая два числа — cur (длина текущего подходящего участка, заканчивающегося в этой позиции) и mx (максимум из всех значений cur, встреченных до сих пор):

s = open('24.txt').readline().strip()

mx = cur = 1
for i in range(1, len(s)):
    if условие(s[i], s[i - 1]):
        cur += 1
    else:
        cur = 1
    if cur > mx:
        mx = cur

print(mx)

Инициализация cur = mx = 1 — не случайность. Один-единственный символ сам по себе всегда образует подходящий участок длины 1: никакое условие на пару соседних символов не может быть нарушено, если соседей у символа ещё нет. Ответ на задание 24 не может быть меньше единицы ни при каких обстоятельствах — даже если файл нарушает условие буквально на каждом шаге.

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

Сила метода в том, что меняется только функция условие(a, b) — предикат, проверяющий пару соседних символов, — а цикл, счётчики и правило сброса остаются одними и теми же для любого локального условия. Именно поэтому все восемь-девять формулировок задания 24 в открытом банке ФИПИ решаются буквально одним и тем же десятком строк с разными двумя-тремя строчками внутри.

Как формализовать условие: «буква не рядом с буквой»

Возьмём типовую формулировку из банка ФИПИ: «текстовый файл состоит из заглавных букв … и цифр …; определите максимальное количество идущих подряд символов, среди которых ни одна буква не стоит рядом с буквой, а цифра — с цифрой». Конкретные буквы (Q, R, W) и цифры (1, 2, 4) значения не имеют — важен только тип каждого символа: буква он или цифра.

В Python тип символа удобно проверить методом s[i].isdigit(): он возвращает True, если символ — цифра, и False, если буква (других символов, кроме заявленного алфавита, в файле не бывает). Условие «ни одна буква не стоит рядом с буквой, а цифра — рядом с цифрой» означает, что тип текущего символа должен отличаться от типа предыдущего:

s[i].isdigit() != s[i - 1].isdigit()

Если оба символа — буквы, оба вызова возвращают False, сравнение != даёт False — серия обрывается, как и требуется. Если один символ буква, а другой цифра, значения True и False различаются — условие выполнено, серия продолжается.

Этот же приём работает для любой формулировки «условие на пару соседних символов», нужно лишь один раз выписать предикат:

  • «ни одна буква не рядом с буквой, цифра — с цифрой»: s[i].isdigit() != s[i - 1].isdigit();
  • «каждые два соседних символа различны»: s[i] != s[i - 1];
  • «нет идущих подряд символов P» (запрещена только сама пара «PP», остальное можно): not (s[i] == 'P' and s[i - 1] == 'P') — обратите внимание, здесь удобнее сформулировать не условие продолжения, а условие обрыва, и поменять местами ветки if и else в каркасе;
  • «расположены в обратном алфавитном порядке (возможно, с повторением)»: s[i] <= s[i - 1] — для букв Python сравнивает их как обычные строки, и порядок совпадает с алфавитным.

Почему нельзя решать перебором всех подстрок

Файлы задания 24 бывают огромными: в реальных заданиях банка ФИПИ — от миллиона символов (10⁶) до десяти миллионов (10⁷). Наивный перебор — проверить все возможные подстроки файла — перебирает порядка n2/2n^2/2 пар границ (начало, конец), а проверка условия внутри каждой подстроки в худшем случае занимает время, пропорциональное её длине. Итоговая сложность — порядка O(n3)O(n^3).

Оценим на реальном числе. Для файла из n=107n = 10^7 символов (пример 1 ниже) n3=1021n^3 = 10^{21} операций. Даже при оптимистичной скорости 10⁹ операций в секунду на такой перебор ушло бы порядка 10¹² секунд — это больше 300 веков (свыше 30 тысяч лет). Более аккуратный перебор без вложенной проверки (растягивать окно от каждой стартовой позиции, пока условие не нарушится) — уже O(n2)=1014O(n^2) = 10^{14} операций, то есть около 10⁵ секунд, больше суток непрерывной работы.

МетодСложностьОпераций при n = 10⁷Время (грубая оценка)
Перебор всех подстрок с проверкойO(n3)O(n^3)10²¹> 300 веков
Растягивание окна от каждого стартаO(n2)O(n^2)10¹⁴> суток
Скользящее окно (один проход)O(n)O(n)10⁷секунды

Ни перебор всех подстрок, ни даже упрощённое растягивание окна не укладываются ни в 18 минут по регламенту экзамена, ни вообще в разумное время работы программы. Единственный практичный вариант — метод одного прохода из блока выше: при n=107n = 10^7 это порядка десяти миллионов элементарных операций, что даже для Python — считаные секунды, а не часы или сутки.

Ловушки в каркасе: off-by-one, перенос строки, забытый максимум

Off-by-one. Возьмём строку из шести символов, где каждые два соседних различны: QRWQRW. Правильный ответ — 6 (вся строка подходит целиком). Если по ошибке инициализировать mx = cur = 0 и сбрасывать cur в 0 при нарушении, программа посчитает не длину участка, а число успешных переходов между соседями — и выдаст 5 вместо 6. Каркас с cur = mx = 1 из блока выше свободен от этой ошибки: он с самого начала считает символы, а не переходы между ними.

Забытый символ переноса строки. Возьмём строку Q1W2 (чередование буква/цифра, ответ — 4). Если не сделать strip(), а в файле есть завершающий \n, строка станет Q1W2\n. Символ переноса строки — не цифра ('\n'.isdigit() равно False), то есть по предикату «тип отличается от предыдущего» он ведёт себя как «буква» и продолжает чередование с последней цифрой «2» — программа насчитает 5 вместо верных 4. Это не теоретическая опасность: у реального задания из банка ФИПИ (пример 1 ниже) файл действительно заканчивается символом \n.

Забытая инициализация максимума единицей. Если условие вообще ни разу не выполняется (например, файл QQQQ, а условие требует, чтобы соседи различались), правильный ответ — всё равно 1: один-единственный символ никогда не нарушает условие сам по себе. При инициализации mx = cur = 0 и сбросе в 0 такая программа напечатает 0 — ответ, которого не может быть в принципе. Хорошая привычка — после решения проверить: ответ должен быть не меньше 1 и не больше длины файла.

Перепутанное направление сравнения. != вместо == (и наоборот) — опечатка, которая не вызывает ошибку выполнения, но переворачивает логику ровно наоборот: вместо самого длинного чередующегося участка программа найдёт самый длинный участок из одинаковых символов. Проверяйте предикат на паре строк вручную, прежде чем запускать на настоящем файле.

Символы, а не пары. В формулировке про согласные и гласные (пример 2 ниже) единица счёта — пара символов, а не отдельный символ. Если механически применить каркас «посимвольного» окна к этому условию, легко получить число символов вместо числа пар — ровно вдвое больше или меньше нужного. Условие всегда говорит явно, что именно считать; перечитайте последнее предложение перед тем, как писать print().

Алгоритм решения задания 24

  1. Прочитайте условие и определите алфавит. Какие символы бывают в файле — только буквы, только цифры или смесь; сколько их видов. Выпишите точное правило для пары соседних символов, включая случаи с запретом конкретной пары («PP») или исключением отдельного символа.
  2. Определите единицу измерения ответа — длина участка (число символов) или количество пар, из которых он состоит. Это явно сказано в последнем предложении условия.
  3. Сформулируйте предикат условие(a, b) на Python и проверьте его вручную на двух-трёх парах символов из условия, прежде чем писать цикл.
  4. Прочитайте файл. s = open('24.txt').readline().strip(). Проверьте len(s) и несколько первых и последних символов.
  5. Реализуйте один проход с cur = mx = 1: увеличивайте cur, пока условие выполняется, сбрасывайте в 1 при нарушении, обновляйте mx на каждом шаге.
  6. Проверьте программу на маленькой строке (5–10 символов), которую можно пересчитать вручную, — и отдельно на строке из одного символа и на строке, где условие не выполняется ни разу.
  7. Выведите одно число. Убедитесь, что печатаете именно то, что просит условие — длину участка или количество пар.

Доведите каркас до автоматизма

Прорешайте 10–15 заданий 24 подряд — и чтение файла, формализация условия и правило сброса счётчика перестанут требовать раздумий. Задания из банка ФИПИ с проверкой ответа — на Repet.ai.

Открыть тренажёр

Примеры с разбором

Пример 1. Чередование буквы и цифры

Условие (реальное задание из открытого банка ФИПИ):

Текстовый файл состоит из заглавных букв латинского алфавита Q, R, W и цифр 1, 2, 4. Определите в прилагаемом файле максимальное количество идущих подряд символов, среди которых ни одна буква не стоит рядом с буквой, а цифра — с цифрой. Для выполнения этого задания следует написать программу.

Решение:

Файл содержит 10 000 000 символов в одной строке, плюс завершающий перенос строки — обязательно используем strip(). Алфавит смешанный: буквы Q, R, W и цифры 1, 2, 4. Условие «ни одна буква не рядом с буквой, а цифра — рядом с цифрой» — это чередование типов символов, тип определяем через isdigit():

s = open('64844_24.txt').readline().strip()

mx = cur = 1
for i in range(1, len(s)):
    if s[i].isdigit() != s[i - 1].isdigit():
        cur += 1
    else:
        cur = 1
    if cur > mx:
        mx = cur

print(mx)

Программа печатает 17.

Ответ: 17. Проверка здравым смыслом: символы в файле идут практически случайно, поэтому длинные чередования редки. Серия длиной 17 из десяти миллионов символов — разумная величина для такой последовательности; ответ в духе «2» или «900» означал бы явную ошибку в предикате или в чтении файла.

Пример 2. Пары «согласная + гласная»

Условие (реальное задание из открытого банка ФИПИ):

Текстовый файл состоит из символов A, C, D, F и O. Определите максимальное количество идущих подряд пар символов вида согласная + гласная в прилагаемом файле. Для выполнения этого задания следует написать программу.

Решение:

Из букв A, C, D, F, O гласные — A и O, согласные — C, D, F. Здесь единица счёта — пара, а не отдельный символ: нас интересует цепочка «согласная-гласная», «согласная-гласная», … максимальной длины, и в ответ идёт количество таких пар, а не количество символов. Если очередная пара подошла — сдвигаемся на 2 позиции вперёд; если нет — на 1:

s = open('59133_24.txt').readline().strip()
glas = 'AO'

mx = cur = 0
i = 0
while i < len(s) - 1:
    if s[i] not in glas and s[i + 1] in glas:
        cur += 1
        i += 2
    else:
        cur = 0
        i += 1
    if cur > mx:
        mx = cur

print(mx)

Программа печатает 95.

Ответ: 95. Это 95 пар подряд — то есть 190 символов файла образуют цепочку из чередующихся согласных и гласных. Обратите внимание: здесь cur инициализирован нулём, а не единицей, — потому что единица измерения теперь пара, а не символ, и «пара из нуля пар» вполне может быть верным начальным значением, в отличие от длины участка, которая не может быть короче одного символа.

Пример 3. Запрещена только пара «PP»

Условие (реальное задание из открытого банка ФИПИ):

Текстовый файл состоит из символов P, Q, R и S. Определите максимальное количество идущих подряд символов в прилагаемом файле, среди которых нет идущих подряд символов P. Для выполнения этого задания следует написать программу.

Решение:

Здесь запрещена только одна конкретная конфигурация — две буквы P подряд («PP»). Все остальные сочетания (в том числе одиночная P рядом с любой другой буквой) допустимы. Логика каркаса «переворачивается» по сравнению с примером 1: серия продолжается почти всегда, а обрывается только в момент обнаружения «PP» — удобнее сформулировать именно условие обрыва и поменять местами ветки if и else:

s = open('53033_24.txt').readline().strip()

mx = cur = 1
for i in range(1, len(s)):
    if s[i] == 'P' and s[i - 1] == 'P':
        cur = 1
    else:
        cur += 1
    if cur > mx:
        mx = cur

print(mx)

Программа печатает 188.

Ответ: 188. Важная деталь: при обрыве новая серия начинается заново с длины 1, отсчитывая от второй буквы P — она сама по себе запрещённой пары не образует и вполне может стать первым символом следующего, ещё более длинного допустимого участка. Сравните масштаб с примером 1: там запрещено почти всё (любая пара «буква-буква» или «цифра-цифра»), и максимальная серия — всего 17 символов из десяти миллионов; здесь запрещена только одна конкретная пара из четырёх букв, ограничение гораздо слабее — и серия вырастает до 188 символов. Чем мягче условие, тем длиннее ожидаемый ответ, — хороший ориентир для проверки здравым смыслом.

Типичные ошибки

Off-by-one: считали переходы вместо символов. При инициализации cur = 0 и сбросе в 0 счётчик фактически считает количество успешных сравнений между соседями, а не длину участка. На строке из шести идеально чередующихся символов это даёт 5 вместо верных 6. Начинайте cur и mx с 1, а не с 0.

Забыли strip() — в счёт попал перенос строки. Символ \n не является цифрой и в предикате «тип отличается от предыдущего» ведёт себя как буква, тихо продолжая чередование на один символ дальше, чем нужно. Файл 64844 из примера 1 заканчивается ровно таким символом — проверено на реальных данных.

Инициализировали максимум нулём. Ответ на задание 24 не может быть меньше 1: один символ сам по себе всегда образует подходящий участок. Если условие ни разу не выполняется, программа с mx = 0 выдаст 0 — значение, которого не может быть в принципе.

Перепутали != и ==. Ошибка не роняет программу — она просто ищет противоположное: вместо самого длинного чередующегося участка находит самый длинный участок из одинаковых символов. Проверяйте предикат вручную на паре строк вида QQ и QR, прежде чем запускать на настоящем файле.

Спутали «число символов» и «число пар». В формулировке про согласные и гласные ответ — количество пар (95), а не количество символов (190). Другие формулировки просят именно число символов. Перечитайте последнее предложение условия перед тем, как писать print().

Пытались решить перебором всех подстрок. На файле в миллион и более символов такое решение либо не завершится за время экзамена, либо вообще не завершится в разумный срок — порядок операций O(n2)O(n^2) или O(n3)O(n^3) для n106107n \sim 10^6-10^7 исключает перебор полностью, а не «просто работает медленно».

Пытались читать файл через input(). Данные лежат в приложенном файле, а не поступают с клавиатуры. Программа с input() вместо open(...).readline() либо зависнет в ожидании ввода, либо, если запущена не в интерактивном режиме, немедленно упадёт с ошибкой.

Как задание 24 связано с остальным экзаменом

Задание 24 не единственное на КЕГЭ, где нужно писать программу и читать данные из файла. Вот с чем полезно его сопоставить:

  • Задание 23 — тот же код требования 2.11 (в кодификаторе он общий для обоих заданий), но там нужно проанализировать уже готовый чужой алгоритм и предсказать результат его работы, а не написать свою программу с нуля; уровень ниже — повышенный, и файла к заданию не прилагается.
  • Задание 17 — тоже обязательно нужен файл `*.txt` и своя программа 10–15 строк, но на входе последовательность целых чисел, а не строка символов; другой КЭС (3.10) и уровень ниже (повышенный вместо высокого).
  • Задание 25 — тоже высокий уровень и своя программа 10–20 строк для обработки целочисленной информации (КЭС 3.4), но без входного файла, и ответ — не одно число, а целая таблица N×2.
  • Задание 26 — тот же класс задач «написать программу для обработки данных из файла `*.txt`», но требует ещё и сортировку, стоит 2 балла и, в отличие от 24, здесь есть частичный зачёт: одно верное число из двух даёт 1 балл вместо 0.

Все перечисленные задания, кроме 26, оцениваются по одному и тому же правилу: ответ либо полностью совпадает с эталоном, либо 0 баллов. Тренируйте задание 24 отдельно от остальных «файловых» линий — формализация условия на соседние символы и каркас скользящего окна требуют своей, отдельной привычки:

План подготовки на 2 недели

Неделя 1 — ставим каркас

День 1–2: освойте базовый шаблон чтения файла и цикла «скользящее окно» на маленьких строках (5–15 символов), которые можно посчитать вручную. Обязательно проверяйте вручную инициализацию (cur = mx = 1) и правило сброса — на бумаге, до запуска кода. День 3–4: разберите 3–4 условия разного типа из открытого банка (чередование букв и цифр, запрет конкретной пары, исключение отдельного символа) и потренируйтесь формулировать предикат условие(a, b) для каждого до того, как садиться писать цикл. День 5–7: прогоните программу на реальных файлах банка ФИПИ длиной от миллиона символов; засеките время работы — один проход должен укладываться в секунды, если счёт идёт на минуты — где-то в коде спрятался вложенный цикл по всей строке.

Неделя 2 — ловушки и скорость

День 1–2: специально протестируйте свою программу на строке с дописанным вручную символом переноса строки в конце и на строке длиной ровно в один символ — оба граничных случая обязаны давать разумный, а не нулевой или заниженный ответ. День 3–4: решите подтип «количество пар», а не «длина участка» (пример с согласными и гласными выше), и научитесь с первого прочтения условия отличать, что именно нужно вывести. День 5–7: решайте задание 24 на время — 18 минут, включая написание и отладку программы, — на реальных заданиях из тренажёра на заданиях из банка ФИПИ, чтобы к экзамену процесс стал автоматическим.

Проверьте себя на реальных заданиях

На Repet.ai собраны задания ЕГЭ по информатике из открытого банка ФИПИ с прикреплёнными файлами. Решайте онлайн, проверяйте ответ мгновенно — бесплатно.

Перейти к практике
Частые вопросы

Часто задаваемые вопросы

Умение создавать собственные программы (10–20 строк) для обработки символьной информации — так дословно формулирует его ФИПИ. К заданию прилагается текстовый файл *.txt из ограниченного набора символов, и нужно найти в нём самый длинный участок (или наибольшее количество пар) с заданным свойством. В кодификаторе это элемент содержания 3.9, раздел «Алгоритмы и программирование», требование 2.11.

1 первичный балл по принципу «всё или ничего»: ответ либо полностью совпадает с эталоном, либо задание оценивается в 0. Частичного зачёта нет — он есть только на заданиях 26 и 27. Уровень сложности — высокий, на задание отводится 18 минут по обобщённому плану ФИПИ.

Стандартный шаблон: s = open('24.txt').readline().strip(). Файл в задании 24 обычно состоит из одной длинной строки, readline() читает её целиком вместе с возможным символом переноса строки на конце, а strip() этот символ убирает. Использовать input() нельзя: эта функция читает данные с клавиатуры, а не из приложенного файла.

Это один проход по строке слева направо с двумя счётчиками: cur — длина текущего подходящего участка, mx — максимум из всех значений cur. Если очередной символ не нарушает условие по отношению к предыдущему, cur увеличивается; если нарушает — сбрасывается в 1 (новая серия начинается с текущего символа). Метод делает ровно один проход по файлу — O(n) операций, — и это единственный вариант, укладывающийся в разумное время на файле из миллионов символов.

Файлы задания 24 достигают 10 миллионов символов. Перебор всех подстрок с проверкой условия внутри каждой — это порядка n³ операций: при n = 10⁷ это 10²¹ операций, что при оптимистичной скорости 10⁹ операций в секунду заняло бы больше 300 веков. Даже упрощённый перебор без вложенной проверки — уже n² ≈ 10¹⁴ операций, больше суток работы. Метод одного прохода делает то же самое за O(n) — считаные секунды.

Это всегда сказано в последнем предложении условия. В большинстве формулировок задания 24 просят «максимальное количество идущих подряд символов» — тогда в ответ идёт длина участка. Но встречаются формулировки вида «максимальное количество идущих подряд пар символов» (например, согласная плюс гласная) — тогда единица счёта не символ, а пара, и ответ вдвое меньше числа символов в найденном участке.

Оба задания требуют написать программу и прочитать файл *.txt, но данные разные: в задании 17 файл содержит последовательность целых чисел (КЭС 3.10, уровень повышенный), а в задании 24 — строку символов, обычно букв и (или) цифр в ограниченном алфавите (КЭС 3.9, уровень высокий). Идея каркаса «счётчик плюс сброс» у них общая, но условия и предикаты — разные.

Инициализация счётчика нулём вместо единицы (даёт заниженный ответ на единицу), забытый strip() при наличии символа переноса строки в конце файла, перепутанные операторы сравнения (!= вместо ==), путаница между «числом символов» и «числом пар», и попытка решить задачу перебором всех подстрок, который физически не укладывается в разумное время на файле из миллионов символов.


Готовы взять балл высокого уровня?

Задание 24 решается по устойчивому шаблону: прочитать файл, формализовать условие на пару соседних символов, пройти один раз с правильно инициализированным счётчиком. Отработайте этот шаблон на реальных заданиях из открытого банка ФИПИ с мгновенной проверкой ответа — и задание перестанет требовать импровизации на экзамене.