Buggy python submission (verdict: Time Limit Exceeded):
# D - Gathering Children
import re

s = input()
sList = list(s)

# 同じ文字が連続していると端のマスに子供が集約される（Rなら右端、Lなら左端）
# 集約が完了したらあとは何回やってもRL間での位置の入れ替えのみ
# → 集約完了回数分は計算、残りの回数が奇数回なら追加で1回試行
retList = []
matchList = re.findall('R+L+', s)

for match in matchList:
    rCnt = match.count('R')
    integrateCnt = (rCnt if rCnt > len(match) - rCnt else len(match) - rCnt) - 1
    addCnt = (10**100 - integrateCnt) % 2

    n = [1] * len(match)
    ret = [1] * len(match)
    for i in range(integrateCnt + addCnt):
        for j, way in enumerate(match):
            ret[j] -= n[j]
            if way == 'R':
                ret[j + 1] += n[j]
            elif way == 'L':
                ret[j - 1] += n[j]
        n = ret[:]
    retList.extend(ret)
print(' '.join(map(str, retList)))

Fixed submission:
# D - Gathering Children
import re

s = input()
sList = list(s)

# RR...RLL...Lは、「RL」の部分に子供が集約される
# RLそれぞれの連続する個数が
# ・同じ   → 同値
# ・異なる → 入れ替えごとに交互に余りを足していく
#          → 差が偶数なら同値
#             差が奇数ならいずれかを1大きくする
retList = []
matchList = re.findall('R+L+', s)

for match in matchList:
    rCnt = match.count('R')
    lCnt = len(match) - rCnt
    
    half = len(match) // 2
    dif = abs(rCnt - lCnt)

    # まずは均等配分する
    ret = [0] * len(match)
    ret[rCnt - 1] = half
    ret[-lCnt] = half
    
    # 個数が同じ         → 既に同値にしているので終了
    # 奇数だけど差が偶数 → 既に同値にしているので終了
    # 奇数かつ  差が奇数
    if dif % 2 != 0:

        # 集約完了までに動かした回数を計算
        changeCnt = (rCnt if rCnt < lCnt else lCnt) - 1 + dif
        
        # 集約完了時点で連続する個数が多かった側が1大きくなっている
        # → 残りの試行回数が奇数なら逆転、偶数ならそのまま
        if (rCnt < lCnt and changeCnt % 2 != 0) or (rCnt > lCnt and changeCnt % 2 == 0):
            ret[rCnt - 1] = half + 1
            ret[-lCnt] = half
        else:
            ret[rCnt - 1] = half
            ret[-lCnt] = half + 1
    retList.extend(ret)
print(' '.join(map(str, retList)))

Buggy python submission (verdict: Time Limit Exceeded):
# D - Gathering Children
import re

s = input()

# 同じ文字が連続していると端のマスに子供が集約される（Rなら右端、Lなら左端）
# 集約が完了したらあとは何回やってもRL間での位置の入れ替えのみ
# → 集約完了回数分は計算、残りの回数が奇数回なら追加で1回試行
rMatch = re.findall('R{1,}', s)
lMatch = re.findall('L{1,}', s)
rMatch.sort(reverse=True)
lMatch.sort(reverse=True)
integrateCnt = len(rMatch[0]) if len(rMatch[0]) > len(lMatch[0]) else len(lMatch[0])
addCnt = (10**100 - integrateCnt) % 2

sList = list(s)
n = [1] * len(s)
ret = [1] * len(s)
for i in range(integrateCnt + addCnt):
    for j, way in enumerate(s):
        ret[j] -= n[j]
        if way == 'R':
            ret[j + 1] += n[j]
        elif way == 'L':
            ret[j - 1] += n[j]
    n = ret[:]
print(' '.join(map(str, ret)))

Fixed submission:
# D - Gathering Children
import re

s = input()
sList = list(s)

# RR...RLL...Lは、「RL」の部分に子供が集約される
# RLそれぞれの連続する個数が
# ・同じ   → 同値
# ・異なる → 入れ替えごとに交互に余りを足していく
#          → 差が偶数なら同値
#             差が奇数ならいずれかを1大きくする
retList = []
matchList = re.findall('R+L+', s)

for match in matchList:
    rCnt = match.count('R')
    lCnt = len(match) - rCnt
    
    half = len(match) // 2
    dif = abs(rCnt - lCnt)

    # まずは均等配分する
    ret = [0] * len(match)
    ret[rCnt - 1] = half
    ret[-lCnt] = half
    
    # 個数が同じ         → 既に同値にしているので終了
    # 奇数だけど差が偶数 → 既に同値にしているので終了
    # 奇数かつ  差が奇数
    if dif % 2 != 0:

        # 集約完了までに動かした回数を計算
        changeCnt = (rCnt if rCnt < lCnt else lCnt) - 1 + dif
        
        # 集約完了時点で連続する個数が多かった側が1大きくなっている
        # → 残りの試行回数が奇数なら逆転、偶数ならそのまま
        if (rCnt < lCnt and changeCnt % 2 != 0) or (rCnt > lCnt and changeCnt % 2 == 0):
            ret[rCnt - 1] = half + 1
            ret[-lCnt] = half
        else:
            ret[rCnt - 1] = half
            ret[-lCnt] = half + 1
    retList.extend(ret)
print(' '.join(map(str, retList)))