1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AtCoder Beginner Contest 136 D - Gathering Children

Last updated at Posted at 2019-08-05

本番中はくだらないミスで正解できなかった。

少し試行を繰り返すと、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)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?