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

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

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

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

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

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

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

 

Текстовый файл состоит из цифр 0, 6, 7, 8, 9 и знаков арифметических операций « – » и «*» (вычитание и умножение). Определите максимальное количество символов в непрерывной последовательности, которая является корректным арифметическим выражением с целыми неотрицательными числами. В этом выражении никакие два знака арифметических операций не стоят рядом, в записи чисел отсутствуют незначащие (ведущие) нули и число 0 не имеет знака.

В ответе укажите количество символов.

Рисунок из условия ФИПИ


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

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

Ответ: 154

Решение.
Считываем исходный текстовый файл одной строкой и убираем завершающий перевод строки. Получаем 10000004 символов. Порядок символов менять нельзя: требуется непрерывный фрагмент исходного текста.
Корректное число имеет вид 0 либо начинается с ненулевой цифры и продолжается цифрами. Выражение состоит из такого числа и нуля или более повторений «знак операции, число». Поэтому оно начинается и заканчивается цифрой, не содержит двух соседних операций и многозначных чисел с первым нулём. Вычислять значение выражения не требуется: неотрицательными должны быть сами числа в записи.
Обрабатываем символы слева направо. Храним три длины фрагментов, заканчивающихся в текущей позиции: z — правильное выражение с последним числом 0; p — правильное выражение с последним положительным числом; op — правильное выражение, после которого записан один знак операции. Значение 0 означает, что фрагмента такого вида нет.
Если очередная цифра равна 0, можно начать новое односимвольное число или поставить 0 после op. Это даёт новое z. К положительному числу ноль приписывать можно, поэтому p увеличивается на единицу, если такое состояние существовало. К отдельному числу 0 приписывать цифру нельзя.
Если цифра ненулевая, новое p — максимум трёх возможностей: начать число с этой цифры, продолжить прежнее положительное число или начать число после операции. Старое z продолжать цифрой нельзя из-за ведущего нуля. Состояния z и op обнуляются.
Если встретился знак операции, он допустим только после законченного числа: op равняется единице плюс максимум прежних z и p. Если обоих состояний не было, op тоже равен нулю. После операции законченного выражения пока нет, поэтому z и p обнуляются.
Будущее продолжение зависит только от вида состояния. Из двух фрагментов одного вида достаточно сохранить более длинный: любое допустимое продолжение пригодно для обоих и сохраняет разность длин. По индукции эти переходы находят самые длинные фрагменты каждого вида в каждой позиции.
В ответ берём максимум z и p по всем позициям. Состояние op не участвует, потому что выражение не может заканчиваться операцией. Все способы начать, продолжить и закончить выражение рассмотрены, следовательно, более длинный допустимый фрагмент не пропущен.
Сохраните скачанный файл рядом с программой под исходным именем. Программа на Python:

with open("img1_1786620617.txt") as f:
    s = f.read().strip()
z = p = op = best = 0
for c in s:
    if c == '0':
        z = op + 1 if op else 1
        p = p + 1 if p else 0
        op = 0
    elif c.isdigit():
        p = max(1, p + 1 if p else 0, op + 1 if op else 0)
        z = op = 0
    else:
        number = max(z, p)
        op = number + 1 if number else 0
        z = p = 0
    best = max(best, z, p)
print(best)

Для исходного файла best = 154.
Проверка: один достигающий фрагмент расположен на позициях 9094263–9094416 при нумерации от единицы. Его длина равна 9094416 − 9094263 + 1 = 154.
Начало этого фрагмента: «79799-60-709*970*78680*7970068»; конец: «60808660*879097866096*8686*8*0». Весь фрагмент независимо разобран как чередование чисел и операций: ведущих нулей и соседних операций нет.
Независимый поиск по грамматике допустимого выражения дал ту же длину и те же границы. На всех строках длины до восьми над алфавитом 0, 1, −, * результат дополнительно сравнен с полным перебором всех подстрок.
Алгоритм выполняет постоянное число действий на каждый символ: время O(n), дополнительная память для состояний O(1), а считанная строка занимает O(n).
Ответ: 154.

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

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

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

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

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

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

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