Problem p02721 (python)

Fixed submission:
import sys
import math
from collections import defaultdict
from bisect import bisect_left, bisect_right

sys.setrecursionlimit(10**7)
def input():
    return sys.stdin.readline()[:-1]

mod = 10**9 + 7

def I(): return int(input())
def LI(): return list(map(int, input().split()))
def LIR(row,col):
    if row <= 0:
        return [[] for _ in range(col)]
    elif col == 1:
        return [I() for _ in range(row)]
    else:
        read_all = [LI() for _ in range(row)]
        return map(list, zip(*read_all))

#################

N,K,C = LI()
S = str(input())

L = []
R = []

for i in range(N):
    if S[i] == 'o':
        if len(L) == 0:
            L.append(i)
        else:
            if L[-1]+C+1 <= i:
                L.append(i)
    if len(L) == K:
        break

for i in range(N)[::-1]:
    if S[i] == 'o':
        if len(R) == 0:
            R.append(i)
        else:
            if R[-1]-C-1 >= i:
                R.append(i)
    if len(R) == K:
        break

R = list(reversed(R))

for i in range(len(L)):
    if L[i] == R[i]:
        print(L[i]+1)

Buggy submission (verdict: Runtime Error):
import sys
import math
from collections import defaultdict
from bisect import bisect_left, bisect_right

sys.setrecursionlimit(10**7)
def input():
    return sys.stdin.readline()[:-1]

mod = 10**9 + 7

def I(): return int(input())
def LI(): return list(map(int, input().split()))
def LIR(row,col):
    if row <= 0:
        return [[] for _ in range(col)]
    elif col == 1:
        return [I() for _ in range(row)]
    else:
        read_all = [LI() for _ in range(row)]
        return map(list, zip(*read_all))

#################

N,K,C = LI()
S = str(input())

dp = [0]*N
for i in range(N)[::-1]:
    if S[i]=='o':
        if i+C+1 >= N:
            dp[i] = 1
        else:
            dp[i] = max(dp[i+C+1]+1,dp[i+1])
    else:
        dp[i] = dp[i+1]

dpz = [0]*N
for i in range(N):
    if S[i]=='o':
        if i-C-1 < 0:
            dpz[i] = 1
        else:
            dpz[i] = max(dpz[i-C-1]+1,dpz[i-1])
    else:
        dpz[i] = dpz[i-1]

ans = []
if dp[1] < K:
    ans.append(1)

for i in range(1,N-1):
    if dp[i]+dpz[i]-1 >= K and dp[i+1]+dpz[i+1]-1 < K and dp[i-1]+dpz[i-1]-1 < K:
        ans.append(i+1)
if N >= 2:
    if dpz[N-2] < K:
        ans.append(N)

for a in ans:
    print(a)

Buggy submission (verdict: Runtime Error):
import sys
import math
from collections import defaultdict
from bisect import bisect_left, bisect_right

sys.setrecursionlimit(10**7)
def input():
    return sys.stdin.readline()[:-1]

mod = 10**9 + 7

def I(): return int(input())
def LI(): return list(map(int, input().split()))
def LIR(row,col):
    if row <= 0:
        return [[] for _ in range(col)]
    elif col == 1:
        return [I() for _ in range(row)]
    else:
        read_all = [LI() for _ in range(row)]
        return map(list, zip(*read_all))

#################

N,K,C = LI()
S = str(input())

dp = [0]*N
for i in range(N)[::-1]:
    if S[i]=='o':
        if i+C+1 >= N:
            dp[i] = 1
        else:
            dp[i] = max(dp[i+C+1]+1,dp[i+1])
    else:
        dp[i] = dp[i+1]

dpz = [0]*N
for i in range(N):
    if S[i]=='o':
        if i-C-1 < 0:
            dpz[i] = 1
        else:
            dpz[i] = max(dpz[i-C-1]+1,dpz[i-1])
    else:
        dpz[i] = dpz[i-1]

ans = []
if dp[1] < K:
    ans.append(1)

for i in range(1,N-1):
    if dp[i]+dpz[i]-1 >= K and dp[i+1]+dpz[i+1]-1 < K and dp[i-1]+dpz[i-1]-1 < K:
        ans.append(i+1)

if dpz[N-2] < K:
    ans.append(N)

for a in ans:
    print(a)