本番中はくだらないミスで正解できなかった。
少し試行を繰り返すと、RLのポイントで子供の数が2回ごとにぐるぐる入れ替わることがわかる。
LかRのポイントを連続してふむ子供がいるうちはその子供はずっと移動し続けるが、どんなに長くとも石版の長さの分の時間が経過したら全ての子供がどこかのRLポイントでぐるぐるしているはずだ。
だから、まず石版の長さの分(k回とする)試行を繰り返し、地点ごとの子供の数をカウントする。
その後、rとlが連続しているポイントをすべて取得。
10**100は偶数なので、kが偶数なら残りの試行回数も偶数、kが奇数なら奇数。
子供の人数は2回の周期で変わるので、kが偶数ならそのまま。奇数ならRLで入れ替える。
li=input().split()[0]
child_li=[1]*len(li)
for i in range(len(li)):
new_child_li=[0]*len(li)
for j in range(len(li)):
# jでそれぞれのますをみる
if li[j]=='R':
new_child_li[j+1]+=child_li[j]
else:
new_child_li[j-1]+=child_li[j]
child_li=new_child_li
rl_list=[(i,i+1) for i in range(len(li)-1) if li[i]=='R' and li[i+1]=='L']
if len(li)%2:
for i in rl_list:
new_child_li[i], new_child_li[i+1]=new_child_li[i+1], new_child_li[i]
print(*new_child_li, sep=' ')
追記:この解法は時間制限で無理でした。
この解法だと計算量は$O(N^2)$で、$N=10^5$だと無理だということが判明しました。pythonの限界は
$O(10^6)$くらいのようです。
改良版
RとLのそれぞれについて、RL文字列を走査して、同じ文字が連続する数を数える。まずRについて考える。
Rについては左から走査して、Lがくるまで連続するRをカウントする。十分に多い回数の試行をしたらこの初めて出現したLとその直前のRのどちらかにこれまでの連続したRにいた子供たちは割り振られるとわかる。
偶数回(10**100は偶数)試行したら、今見ているRLの前にあった連続したRについて、0始まりのindexで偶数番目のRにいた子供はRLのR側に、奇数番目のRにいた子はL側にいるとわかる。これでRにいる子供たちについては終わった。
Lに関しても同様の要領でやる。ただし今回は右からLR文字列を走査して、連続したLの数を左側のRLのいずれかに割り振ります。
これを足し合わせることで答えが出る。実際には$O(N)$でとける問題だった。
li=input()
n=len(li)
child_li=[0]*n
ruiseki=0
for i in range(n-1):
if li[i]=='R':
ruiseki+=1
if li[i+1]=='L':
child_li[i+1]=ruiseki//2
child_li[i]=(ruiseki+1)//2
else:
ruiseki=0
ruiseki=0
for i in range(n-1, 0, -1):
if li[i]=='L':
ruiseki+=1
if li[i-1]=='R':
child_li[i-1]+=ruiseki//2
child_li[i]+=(ruiseki+1)//2
else:
ruiseki=0
print(*child_li)