Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

[Ruby] AtCodr D - Handstand

updated on 2019-04-18

問題atCoder https://atcoder.jp/contests/abc124/tasks/abc124_d


N,K = gets.split.map(&:to_i)
S = gets.chomp
nums = []
num = "1"
count = 0

for i in 0..N-1 do
# 連続数カウント
if S[i] == num then
count+=1
else
# 連続数メモ&カウントのリセット&カウント数字の切り替え
nums.push(count)
count = 1
num = num == "1"  ? "0" : "1"
end
end
# 最後まで行くと、それ以上連続しないのでカウントをメモ
nums.push(count)
# 1..0みたいに0で終わってたら1の連続数0を加える
if nums.length % 2 == 0
nums.push(0)
end

add = 2 * K + 1
left = 0
right = 0
tmp = 0
ans = 0

# 1の連続数は偶数ばんめのインデックス
0.step(nums.length-1, 2) do |i|
# 連続の一番左インデックス
# 連続の一番右インデックスの一個右
nextleft = i
nextright = [i + add, nums.length].min

# インデックス0から連続の左端手前まで引く
while nextleft > left
tmp -= nums[left]
left += 1
end
# インデックス0から連続の右端までたす
while nextright > right
tmp += nums[right]
right += 1
end
ans = tmp if tmp > ans  

end

puts ans