python競技プログラミング

ARC104

スポンサーリンク

配点くらい参加する前に見よう

A解いてさてBだ。なんかむずくね?配点:400
そりゃそうだよね。何を思ったんだろうか。
配点は参加する前に確認して参加するかどうか決めよう。

ただ、割とB問題がうまく方向性が決まったため、順位が上がるかと思ったがさっぱり上がらない。もとよりABC組は参加していないOR B問題早解きできなければA問題未提出での撤退が正着。

B問題

問題文が理解できないが上位層はあっという間に解いていく。ATAとTATでは相補的ではないという理由がよくわからんが結局のところその部分列においてAの数=Tの数,かつCの数=Gの数ならカウントし、それ以外ならカウントしなければOKであることがサンプルからわかる。
愚直にカウントすると楽勝でタイムアウトするため,何かないかと思ったところ、累積和使えば行けるなということで,2次元累積和を使用する。ATCGだけだし1次元累積和*4でもOK。

import copy
N,S=map(str,input().split())
 
#print(S)
lens=len(S)
#S=[[0] * 3 for _ in range(2)] 2行3列の場合
T=[[0] * 4 for _ in range(lens+1)]
l=1
for i in range(lens):
    if l!=0:
        T[l]=copy.deepcopy(T[l-1])
    
    if S[i]=="A":
        T[l][0]+=1
    elif S[i]=="T":
        T[l][1]+=1
    elif S[i]=="C":
        T[l][2]+=1
    elif S[i]=="G":
        T[l][3]+=1
    
    
    l+=1
tmp3=[0]*4
#print(T)
tlen=2
count=0
while tlen<=lens:
    for i in range(lens-tlen+1):
        tmp1=T[i]
        tmp2=T[i+tlen]
 
        tmp3[0]=tmp1[0]-tmp2[0]
        tmp3[1]=tmp1[1]-tmp2[1]
        tmp3[2]=tmp1[2]-tmp2[2]
        tmp3[3]=tmp1[3]-tmp2[3]
        
        if tmp3[0]==tmp3[1] and tmp3[2]==tmp3[3]:
            count+=1
            
    tlen+=2
print(count)

これ解いてパフォ600代ですか…20分短縮しても700か…5分で解けりゃ1600かもしれんがさすがにそれは無理。diff400すかこれ!とんでもない時代だ。

コメント

タイトルとURLをコピーしました