ГлавнаяЕГЭ ИнформатикаТеорияОбработка символьных строк и числовых последовательностей (ЕГЭ, задания 17, 24)

Обработка символьных строк и числовых последовательностей (ЕГЭ, задания 17, 24)

Коротко о главном

Задания 17 и 24 объединяет одно умение — читать данные из файла (числа или текст) и обрабатывать их по циклу с накоплением результата.

  • Задание 17 — большая числовая последовательность (обычно 10³–10⁶ чисел). Нужно найти пары/тройки чисел с заданными условиями (сумма, произведение, четность, кратность) и посчитать что-то по ним (максимум суммы, количество пар и т.п.).
  • Задание 24 — длинная символьная строка (текст). Нужно найти количество вхождений подстрок, самую длинную/короткую последовательность одинаковых символов, заменить символы по правилу и т.д.

Общий алгоритм: открыть файл → прочитать данные → пройтись циклом с накоплением условия → вывести ответ.

Определения и формулы/правила

Понятие Смысл Пример
Последовательность Набор чисел a1,a2,…,ana_1, a_2, \dots, a_n, читаемых из файла 1 5 -3 8 2 ...
Подпоследовательность (17) Непрерывный или несмежный набор элементов с условием пара (ai,aj)(a_i, a_j): ai⋅aj>0a_i \cdot a_j > 0
Подстрока (24) Непрерывный набор символов строки в abccba подстрока cc
Максимальная серия Самый длинный участок одинаковых/монотонных элементов 1112111 → серия из 3 единиц
Индексация Символы строки нумеруются с 1 (в задачах ЕГЭ) или с 0 (в Python) s[1]s[1] — первый символ

Правило поиска пары с условием (17): если ai⋈aj (условие выполнено), то обновить накопитель \text{если } a_i \bowtie a_j \text{ (условие выполнено)}, \text{ то обновить накопитель} где ⋈\bowtie — знак условия: >, <, %, чётность и т.д.

Правило подсчёта серии одинаковых символов (24): если s[i]=s[i−1]⇒len+=1,иначе len=1 \text{если } s[i] = s[i-1] \Rightarrow \text{len} \mathrel{+}= 1, \quad \text{иначе len} = 1 и на каждом шаге сравнивать len с текущим максимумом maxlen.

Формула суммы/количества по условию: S=∑i=1nai⋅[P(ai)] S = \sum_{i=1}^{n} a_i \cdot [P(a_i)] где [P(ai)][P(a_i)] — индикатор (1, если условие выполнено, иначе 0).

Как применять

Пример 1 (задание 17). Найти количество пар соседних чисел, оба кратных 3, и сумму максимальной такой пары.

with open('17.txt') as f:
    a = [int(x) for x in f.read().split()]

count = 0
max_sum = 0
for i in range(len(a) - 1):
    if a[i] % 3 == 0 and a[i+1] % 3 == 0:
        count += 1
        max_sum = max(max_sum, a[i] + a[i+1])

print(count, max_sum)

Пример 2 (задание 17). Найти пару чисел (не обязательно соседних), одно чётное, другое нечётное, с максимальным произведением.

even = [x for x in a if x % 2 == 0]
odd = [x for x in a if x % 2 != 0]
best = max(e * o for e in even for o in odd)  # для больших n нужен более быстрый способ:
# max(even) * max(odd), если оба положительны, либо анализ знаков

Пример 3 (задание 24). Найти длину самой длинной серии одинаковых символов в строке.

with open('24.txt') as f:
    s = f.read().strip()

maxlen = 1
cur = 1
for i in range(1, len(s)):
    if s[i] == s[i-1]:
        cur += 1
        maxlen = max(maxlen, cur)
    else:
        cur = 1

print(maxlen)

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

  • Путают индексацию с 0 и с 1 — при описании условия в задаче (например, «чётные позиции») легко сбиться на off-by-one.
  • Не учитывают граничные элементы — забывают проверить последний/первый элемент после цикла (особенно при подсчёте серии, максимум нужно обновить и после выхода из цикла).
  • Используют квадратичный алгоритм там, где нужен линейный — при переборе всех пар чисел на больших файлах (n∼105n \sim 10^5–10610^6) программа не успевает выполниться за отведённое время; нужно искать способ обойтись одним проходом.
  • Забывают про типы данных — при работе со строками путают int и str, при извлечении цифр из строки не переводят их в число.
  • Не учитывают знак чисел — в условиях на произведение/сумму максимум может достигаться на двух отрицательных числах, а не на двух положительных.
  • Неверно читают файл — не убирают пробелы/переносы строк (strip()), из-за чего в конец списка попадает пустая строка или лишний символ.
  • Смешивают подряд идущие и произвольные элементы — задача может требовать именно соседние элементы, а решение ищет любую пару в массиве.

Где встречается на экзамене

  • Задание 17 — анализ числовой последовательности из файла: поиск пар/троек по условию, статистика (суммы, произведения, количество), часто с ограничением на «соседство» элементов.
  • Задание 24 — анализ строки/текста из файла: подсчёт вхождений подстрок, поиск максимальных серий символов, замена по шаблону, обработка текста с учётом регистра или цифр.
  • Обе задачи требуют написания короткой программы (Python, Паскаль, С++, Excel/VBA — любой язык) и относятся к практическому программированию, где важна как правильность алгоритма, так и его эффективность по времени.

Частые вопросы

Чем отличаются задания 17 и 24 по типу данных?

В 17 обрабатывается последовательность чисел из файла, в 24 — строка символов (текст). Алгоритмический подход похож: один проход по данным с накоплением результата.

Нужно ли учитывать индексацию с 1 при решении на Python?

В условии задачи элементы часто нумеруются с 1, а в Python индексы начинаются с 0. Переводите условие в индексы Python аккуратно, чтобы не сдвинуть позицию на единицу.

Как проверить, что моя программа не превысит лимит по времени?

Если в файле до миллиона чисел, избегайте вложенных циклов (O(n²)). Ищите способ решить задачу за один проход (O(n)) с использованием накопителей, множеств или предварительно вычисленных максимумов/минимумов.

Что делать, если в конце файла есть лишний пробел или пустая строка?

Используйте strip() перед разбиением строки, а при чтении чисел через split() пустые токены автоматически игнорируются.

Как искать максимальную серию одинаковых символов или чисел?

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

Можно ли решать 17 и 24 не на Python?

Да, подходит любой язык программирования (Паскаль, С++, Java, VBA в Excel) — оценивается корректность алгоритма и результат, а не конкретный синтаксис.

Потренироваться: задание 17 · задание 24