Условие задачи
Текстовый файл содержит строку из символов A, B, C и D.
Определите количество непрерывных фрагментов строки, которые начинаются на букву A, заканчиваются на букву A и содержат ровно 30 букв C.
В ответе запишите одно целое число.
Для выполнения задания используйте файл: 24_A_30_C_01.txt
Подсказка
Удобно рассматривать позиции всех букв C. Если фрагмент содержит ровно 30 букв C, то его левая граница должна находиться после предыдущей C, а правая — перед следующей C.
Для каждого набора из 30 подряд идущих букв C нужно посчитать, сколько букв A может быть началом фрагмента и сколько букв A может быть концом фрагмента.
Решение
Найдём позиции всех букв C. Добавим фиктивные позиции -1 и len(s), чтобы удобно обрабатывать начало и конец строки.
Будем брать каждые 30 подряд идущих букв C. Для такого набора левая граница фрагмента может находиться после предыдущей C, а правая граница — перед следующей C.
Так как фрагмент должен начинаться и заканчиваться на A, нужно перемножить количество букв A в левой допустимой зоне и количество букв A в правой допустимой зоне.
s = open('24_A_30_C_01.txt').read().strip()
c = [-1]
for i, ch in enumerate(s):
if ch == 'C':
c.append(i)
c.append(len(s))
ans = 0
k = 30
for i in range(1, len(c) - k):
left_zone_l = c[i - 1] + 1
left_zone_r = c[i]
right_zone_l = c[i + k - 1]
right_zone_r = c[i + k] - 1
left_a = s[left_zone_l:left_zone_r + 1].count('A')
right_a = s[right_zone_l:right_zone_r + 1].count('A')
ans += left_a * right_a
print(ans)
Ответ: 3047.