Problem p03074 (python)

Fixed submission:
def main():
    N, K = map(int, input().split())
    S = input()
    seq = []
    current = "1"
    cnt = 0
    # 初手が0だと0の累積和が最初に入る(e.g. [1,2,1]が[0,1,2,1]となる)
    # ex. 0001011ならseq = [3,1,1,2] (0が3つ,1が1つ,0が2つ,1が2つ)
    for c in S:
        if c == current:
            cnt += 1
        else:
            seq.append(cnt)
            current = c
            cnt = 1
    seq.append(cnt)  # 切り替えのあったタイミングで初めて挿入されるので、最後のカウントは挿入されていないので、ここで入れる
    if len(seq) % 2 == 0:
        seq.append(0)  # 0挿入なので、大勢には影響しない。理由は不明。

    # K1回で2つの切り替え00010001 = [3,1,3,1]=>右の0３つを変えると=>[3,4]となる
    # 現在seqに格納されているのは切り替えデータだからK*2+1以内なら、全て1になる
    if len(seq) <= K*2+1:
        print(sum(seq))
        return
    ans = 0
    total = 0
    j = 0
    # Kで２つseqが消える→rangeはそれを差し引いた回数
    # 2Kの範囲でseqを前から進めていくansが最大となるものをキープし、出力する

    for i in range(len(seq)-K*2):
        while j < i+K*2+1:
            total += seq[j]
            j += 1
        if i % 2 == 0:
            ans = max(ans, total)
        total -= seq[i]  # 今回のtotalは既にキープしてあるので、動いて消える部分は取り除く
    print(ans)


if __name__ == "__main__":
    main()

Buggy submission (verdict: Runtime Error):
times = input().split()
N = int(times[0])
K = int(times[1])
S = input()


def one_counter(S):
    S = S.split("0")
    high = 0
    tmp = 0
    for i in S:
        tmp = i.count("1")
        if tmp > high:
            high = tmp
    return high


last_score = 0
for i in range(K):
    if S.find("0") == -1:
        last_score = len(S)
        break
    zero_counter = []
    start_index = -1
    end_index = -1
    diff = 0
    for j, value in enumerate(S):
        if value == "0" and start_index == -1:
            start_index = j
        elif value == "1" and start_index != -1:
            end_index = j
            diff = end_index - start_index
            zero_counter.append([start_index, end_index, diff])
            start_index = -1
            end_index = -1
            diff = 0
    high_score = one_counter(S)
    high_S = S
    for k in zero_counter:
        S_f = S[:k[0]]
        S_b = S[k[1]:]
        ones = "1"*k[2]
        tmp_S = S_f+ones+S_b
        score = one_counter(tmp_S)
        if score > high_score:
            high_S = tmp_S
            last_score = score
    S = high_S


print(last_score)
times = input().split()
N = int(times[0])
K = int(times[1])
S = input()


def one_counter(S):
    S = S.split("0")
    high = 0
    tmp = 0
    for i in S:
        tmp = i.count("1")
        if tmp > high:
            high = tmp
    return high


last_score = 0
for i in range(K):
    if S.find("0") == -1:
        last_score = len(S)
        break
    zero_counter = []
    start_index = -1
    end_index = -1
    diff = 0
    for j, value in enumerate(S):
        if value == "0" and start_index == -1:
            start_index = j
        elif value == "1" and start_index != -1:
            end_index = j
            diff = end_index - start_index
            zero_counter.append([start_index, end_index, diff])
            start_index = -1
            end_index = -1
            diff = 0
    high_score = one_counter(S)
    high_S = S
    for k in zero_counter:
        S_f = S[:k[0]]
        S_b = S[k[1]:]
        ones = "1"*k[2]
        tmp_S = S_f+ones+S_b
        score = one_counter(tmp_S)
        if score > high_score:
            high_S = tmp_S
            last_score = score
    S = high_S


print(last_score)