Текстовый файл состоит не более чем из \(10^6\) символов и содержит только десятичные цифры и заглавные буквы латинского алфавита. Определите в этом файле последовательность наибольшей длины идущих подряд символов, представляющих собой восьмеричную запись числа, кратного \(13.\) Если таких последовательностей несколько, выберите последовательность с наименьшим числовым значением. В ответе запишите индекс (номер) первого символа (первой значащей цифры), с которого начинается запись этого числа в прилагаемом файле. Нумерация символов в текстовом файле начинается с нуля.
Решение:
Python
from re import finditer
s = open('8120.txt').readline().strip()
nums = []
f = [5, -1, -5, 1] # остатки деления степеней восьмерки на 13
ml = 0
for g in finditer(r'[1-7][0-7]+', s):
if len(g.group(0)) < ml:
continue
ts = g.group(0)
len_ts = len(ts)
pref = [0] * len_ts
r = (4 - len_ts % 4) % 4
pref[0] = f[r] * int(ts[0], 8) % 13
for i in range(1, len_ts):
pref[i] = (pref[i-1] + f[(r + i) % 4] * int(ts[i], 8)) % 13
if pref[-1] == 0:
nums.append(ts)
ml = len_ts
else:
s_tmp = set()
for k in range(len_ts - ml):
if ts[k] not in s_tmp:
s_tmp.add(ts[k])
for p in range(len_ts - 1, ml + k, -1):
if pref[p] == pref[k]:
ml = max(ml, p - k)
nums.append(ts[k+1:p+1])
break
m = max(len(d) for d in nums)
nums = sorted([d for d in nums if len(d) == m])
print(s.find(nums[0]))
Ответ: \(605381\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене