ЕГЭ, ОГЭ, программирование и робототехника в Калининграде

№ 24030. Демоверсия

Текстовый файл состоит из десятичных цифр и заглавных букв латинского алфавита.

Определите в прилагаемом файле максимальное количество идущих подряд символов, среди которых подстрока 2025 встречается не менее 90 раз и при этом содержится ровно 80 букв Y. В ответе запишите число – количество символов в найденной последовательности.

with open('2430.txt', 'r') as file:
    data = file.readline()

max_len = 0
n = len(data)

for left in range(n):
    for right in range(left + max_len, n + 1):
        substr = data[left:right]
        if substr.count('Y') > 80:
            break
        if substr.count('Y') == 80 and substr.count('2025') >= 90:
            max_len = max(max_len, len(substr))

print(max_len)


# === ОПТИМИЗИРОВАННЫЙ КОД (дек + два указателя) === #
from collections import deque

with open('2430.txt') as file:
    data = file.readline()

n = len(data)
max_len = 0
left = 0
count_Y = 0
count_2025 = 0
window = deque()  # храним индексы начала найденных подстрок'2025'

for right in range(n):
    # Добавляем текущий символ
    if data[right] == 'Y':
        count_Y += 1

    # Проверяем, начинается ли '2025' на позиции right - 3
    if right >= 3 and data[right-3:right+1] == '2025':
        window.append(right - 3)
        count_2025 += 1

    # Сдвигаем левый указатель, если Y > 80
    while count_Y > 80:
        if data[left] == 'Y':
            count_Y -= 1
        # Если удаляемая позиция была началом '2025', убираем её
        if window and window[0] == left:
            window.popleft()
            count_2025 -= 1
        left += 1

    # Проверяем условие: ровно 80 Y и хотя бы 90 '2025'
    if count_Y == 80 and count_2025 >= 90:
        max_len = max(max_len, right - left + 1)

print(max_len)

# === РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ === #
import re

with open('2430.txt') as f:
    s = f.readline().strip()

K = 80
letter = 'Y'
need = 90
sub = '2025'

# позиции всех Y
pos = [m.start() for m in re.finditer(letter, s)]

max_len = 0

for i in range(len(pos) - K + 1):
    left = pos[i]
    right = pos[i + K - 1]

    # расширяем влево
    l = left
    while l > 0 and s[l - 1] != letter:
        l -= 1

    # расширяем вправо
    r = right
    while r + 1 < len(s) and s[r + 1] != letter:
        r += 1

    substr = s[l:r + 1]

    if substr.count(sub) >= need:
        max_len = max(max_len, len(substr))

print(max_len)
Разберём это задание на бесплатном пробном занятии

Преподаватель покажет, как решать такие задачи, и подскажет, с чего начать подготовку. Группы до 8 человек, очно в Калининграде и онлайн.

Записаться на пробное занятие