読者です 読者をやめる 読者になる 読者になる

君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

Codeforces Round #380 (Div.2, Rated, Based on Technocup 2017 - Elimination Round 2)

はい。
http://codeforces.com/contest/738

A. Interview with Oleg

ざっくりと大意

・ogo,ogogo,...を***に置換して出力する。

  Python2 

n=int(raw_input())
s=raw_input()
for i in range(50,0,-1):
    tmp='o'+'go'*i
    s=s.replace(tmp,'***')
print s

sの最大の長さより余裕をみて長いogo...からreplaceをかけていってogoまで試し終わったら解になる。

B. Spotlights

ざっくりと大意

・ステージがn * mの長方形で1が俳優で0が照明。
・各照明の上下左右の方向に俳優がいれば方向ごとに+1して合計で幾つになるか。
  Pypy2  

n,m=map(int,raw_input().split())
l,r=[],[]
ans=0
for i in range(n):
    a=map(str,raw_input().split())
    tmp=''.join(a)
    l.append(tmp)
    chk=tmp.split('1')
    f=len(chk)
    if f==2:
        ans+=len(chk[0])+len(chk[1])
    elif f>2:
        for j in range(f):
            if j==0 or j==f-1:
                ans+=len(chk[j])
            elif j<f-1:
                ans+=len(chk[j])*2
for i in range(m):
    tmp=''
    for j in range(n):
        tmp=l[j][i]+tmp
    r.append(tmp)
for i in r:
    chk=i.split('1')
    f=len(chk)
    if f==2:
        ans+=len(chk[0])+len(chk[1])
    elif f>2:
        for j in range(f):
            if j==0 or j==f-1:
                ans+=len(chk[j])
            elif j<f-1:
                ans+=len(chk[j])*2
print ans

Python2で出すとTLEでPypy2ならかなり余裕あり。。これ本番でだといやだな。入力を受け取ってリストに入れながら、その時の行を'1'でsplitして要素数が2つか、それ以上などで右にしか1がないゾーン、左右にある、左にしかないを分けて計算した。
そして元々のリストを90度回転させて同様の数え方をした。回転させたのは縦をまとめて数える方法がわからなかったため。