(А.Богданов) Текстовый файл состоит из 10 млн десятичных цифр дробной части числа π.
Найти длину максимальной строки, сумма цифр которой кратна 7 и не содержит двух одинаковых цифр подряд.
В ответе укажите количество символов.
Решение
Фрагменты и остатки по mod 7
🔹 Шаг 1. Читаем файл в строку s
s = open("24.txt").read()
ans = start = 0
📌 Читаем файл в строку s. Задаём ans для ответа и start — начало текущего фрагмента, в котором нет двух одинаковых цифр подряд.
🔹 Шаг 2. Идём по строке: если очередная цифра совпадает с предыдущей, фрагмент…
for i in range(1, len(s) + 1):
if i == len(s) or s[i] == s[i - 1]:
📌 Идём по строке: если очередная цифра совпадает с предыдущей, фрагмент закончился — его нужно обработать отдельно, а новый начинается с этой позиции.
🔹 Шаг 3. В каждом фрагменте ищем максимальную длину подстроки с суммой цифр…
seg = s[start:i]
first = {0: -1}
pref = mx = 0
📌 В каждом фрагменте ищем максимальную длину подстроки с суммой цифр, кратной 7: ведём сумму по модулю 7 и словарь first с первым индексом каждого остатка.
🔹 Шаг 4. Если текущий остаток уже встречался, длина между этими позициями —…
for j, c in enumerate(seg):
pref = (pref + int(c)) % 7
if pref in first:
mx = max(mx, j - first[pref])
else:
first[pref] = j
📌 Если текущий остаток уже встречался, длина между этими позициями — кандидат; иначе запоминаем первое появление. Обновляем локальный максимум и ans.
🔹 Шаг 5. Жми RUN
ans = max(ans, mx)
if i < len(s):
start = i
print(ans)
📌 Жми RUN — в выводе будет 126 (максимальная длина подходящей подпоследовательности).
✅ Ответ: 126
🔹 Полный код
s = open("24.txt").read()
ans = start = 0
for i in range(1, len(s) + 1):
if i == len(s) or s[i] == s[i - 1]:
seg = s[start:i]
first = {0: -1}
pref = mx = 0
for j, c in enumerate(seg):
pref = (pref + int(c)) % 7
if pref in first:
mx = max(mx, j - first[pref])
else:
first[pref] = j
ans = max(ans, mx)
if i < len(s):
start = i
print(ans)