Вариант 1
ровно 67 букв Y и 2025Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита. Определите в прилагаемом файле максимальное количество идущих подряд символов, среди которых подстрока 2025 встречается не менее 151 раз и при этом содержится ровно 67 букв Y. В ответе запишите число — количество символов в найденной последовательности.
Файл к варианту: Ege24_v1.txt (200 000 символов в одной строке). Для выполнения этого задания следует написать программу.
Разбор
Идея. Возьмём 67 букв Y подряд (с i-й по (i + 66)-ю) и расширим окно влево до предыдущей буквы Y и вправо до следующей, не включая их. Получится самая длинная цепочка с ровно этими буквами: любая подходящая цепочка лежит внутри одного такого окна.
Условие на 2025. Чем длиннее окно, тем больше в нём вхождений 2025, поэтому достаточно проверить только эти «максимальные» окна: подходит окно, если в нём не меньше 151 вхождений.
Скорость. Позиции букв и начала вхождений 2025 записываем в списки один раз; количество вхождений в окне считаем через bisect — программа работает доли секунды.
Ответ для файла варианта: 3473.
Ответ: 3473
Решение на Python. Положите файл варианта рядом с программой.
from bisect import bisect_left, bisect_right
s = open('Ege24_v1.txt').readline().strip()
ys = [-1] + [i for i, c in enumerate(s) if c == 'Y'] + [len(s)]
occ = [i for i in range(len(s) - 3) if s[i:i + 4] == '2025'] # начала вхождений
M, K = 67, 151
best = 0
for i in range(1, len(ys) - M):
l, r = ys[i - 1] + 1, ys[i + M] - 1 # ровно M букв внутри [l, r]
cnt = bisect_right(occ, r - 3) - bisect_left(occ, l)
if cnt >= K:
best = max(best, r - l + 1)
print(best)