Здравствуйте. Во втором решении в файле "27-119_shastin.py" есть ошибка в вычислении индексов:
for i in range(K//2, N - K//2):
if p[i + K//2][1] - p[i - 1 - K//2][1]:
s1 = p[i + K//2][0] - p[i ][0]
s2 = p[i - 1][0] - p[i - 1 - K//2][0] if i - 1 - K//2 else p[i - 1][0]
count += (s1 == s2)
Для следующего файла ответ будет 0, хотя правильный 1:
5 5
1
2
0
2
1
Происходит это из-за того, что в следующих местах индексы вычисляются неверно:
if p[i + K//2][1] - p[i - 1 - K//2][1]:
При i == K//2 для "хвоста" суммы мы получим следующий индекс: K//2 - 1 - K//2 = -1, т.е. в самой первой итерации цикла мы попадем в последний элемент p, хотя нам на этой итерации ничего не нужно вычитать из счетчика нулей. Избежать этого можно с помощью пустого элемента в начале массива p (p = [(0, 0)]).
s2 = p[i - 1][0] - p[i - 1 - K//2][0] if i - 1 - K//2 else p[i - 1][0]
Во-первых, отрицательное число в условии воспринимается как True. Поэтому при i = K//2 условие "if -1" будет True и мы вычтем опять сумму из конца массива p.
Во-вторых, при i = K//2 + 1 мы получим "if 0" и s2 будет вычисляться как "p[i - 1][0]" т.е. как "p[K//2][0]", что тоже неправильно, поскольку на этом шаге уже нужно вычитать сумму на нулевом элементе.