# printf("----定義----\n")
str = gets.split(//)
stack = Array.new
# printf("stack:[%s]\n", stack.join(" "))
lake_size = Array.new(1, 0)
# printf("lake_size:[%s]\n", lake_size.join(" "))
height = 0
# printf("height:%d\n", height)
i = 0
# printf("地形を左からチェック\n")
str.each{|char|
    i += 1
    # printf("----%dつ目の地形----\n", i)
    case char
    when '\\'
    # printf("地形は”%s”なので\n", char)
    # printf(" 下り坂の数を1増やす ")
    height += 1
    # printf("(height = %d)\n", height)
    # printf(" stackに地形を追加 ")
    stack.push char
    # printf("(stack = [%s])\n", stack.join(", "))
    when '/'
    # printf("\n//上り坂発見//\n\n")
    # printf("stackの中から一番近い下り坂を探す\n")
    if height != 0
    #   printf(" 下り坂の数が0でなければ (height = %d)\n", height)
        width = 1
    #   printf("  上り坂からの距離を1とする (width = 1)\n")
    #   printf("  stackの最後を取り出す (stack = [%s])\n", stack.join(", "))
        j = 0
        while case temp = stack.pop
            when '\\'
                j += 1
            #   printf("  ---%dつ前の地形---- (上り坂からの距離 = %d)\n", j, width)
            #   printf("\n  stackの中に\\\\下り坂発見\\\\\n\n")
                
            #   printf("  lake_size = [%s]\n", lake_size.join(", "))
            #   printf("  lake_sizeの最後の値に上り坂からの距離 (width = %d)を加算 ", width)
                lake_size.push(lake_size.pop + width)
            #   printf("(lake_size = [%s])\n", lake_size.join(", "))
            #   printf("  lake_sizeの最後に次の池の準備を追加 ")
                lake_size.push 0
            #   printf("(lake_size = [%s])\n\n", lake_size.join(", "))

            #   printf("  池の面積を計算した場所は次の地形探索では\"_\"と同じ扱いなので\n" )
            #   printf("  stackの最後に 上り坂からの距離 + 1 を追加 " )
                stack.push width + 1
            #   printf("(stack = [%s])\n\n", stack.join(", "))
                
                false
            when Integer
                j += 1
            #   printf("  ---%dつ前の地形---- (上り坂からの距離 = %d)\n", j, width)
            #   printf("  stackに数字が入っている場合は、次の池の準備を削除\n")
            #   printf("  lake_size = [%s] → ", lake_size.join(", "))
                
                lake_size.push(lake_size.pop + lake_size.pop)
            #   printf("[%s]\n", lake_size.join(", "))
            #   printf("  上り坂からの距離にstackの最後の数字を加算 ")
                width += temp
            #   printf("(width = %d)\n", width)
                true
            else
                j += 1
            #   printf("  ---%dつ前の地形---- (上り坂からの距離 = %d)\n", j, width)
            #   printf("  地形が\"_\"の時\n")
            #   printf("  上り坂からの距離を1増やす ")
                width += 1
            #   printf("(width = %d)\n", width)
                true
            end
        end
    #   printf("  下り坂の探索終了\n")
    #   printf("  下り坂の数を1減らす")
        height -= 1
    #   printf(" (height = %d)\n", height)
    else
    #   printf("探すべき下り坂がない\n")
    end
    else
    # printf("地形が”%s”なので\n", char)
    # printf(" 下り坂の数はそのままで (height = %d)\n", height)
    # printf(" stackに地形を追加 ")
    stack.push char
    # printf("(stack = [%s])\n", stack.join(", "))
    end
#   printf("\n次の地形!!\n\n")
}
# printf("\n探索終了!!\n\n")
# printf("lake_sizeの合計\n")
puts lake_size.reduce(&:+)
# printf("lake_sizeの最後の項を削除\n")
# printf("lake_size = [%s] → ", lake_size.join(", "))
lake_size.pop
# printf("[%s]\n", lake_size.join(", "))
lake_size.unshift(lake_size.size)
puts lake_size.join(" ")


Measured memory_bytes: 7456