私の記録ブログ

趣味の記録

atcoder abc_122 を解いてみた(python3)

-A. [AC] Double Helix

問題ページ【A - Double Helix

# -*- coding: utf-8 -*-

b = input()

if b=='A':
    print('T')
elif b == 'T':
    print('A')
elif b == 'C':
    print('G')
else:
    print('C')


塩基が4つしかないので4パターンの条件分岐で通せた。
パターンが多い時は配列を使うといいらしい(今度書く)

-B. [AC] ATCoder

問題ページ【B - ATCoder

# -*- coding: utf-8 -*-

s  = input()

a = 0
max = 0
for i in range(len(s)):
    if s[i] == 'A' or s[i] == 'T' or s[i] == 'C' or s[i] == 'G':
        a = a+1
    else:
        a = 0

    if max < a:
        max = a

print(max)


入力した配列を全探索し、'A','T','C','G'の場合aを1増やす。
そうではなかった場合はa=0に初期化する。
そしてaが最大値を更新する度に、maxにaを代入する。

-C. [AC] GeT AC

問題ページ【C - GeT AC
chokudauさんの解説(C++)をpython3で書き直した。

# -*- coding: utf-8 -*-
#入力
n, q  = map(int,input().split())
s = input()
l = [0]*q
r = [0]*q
for i in range(q):
    l[i], r[i] = map(int,input().split())

#累積和を求める
sum = [0]*(n+1)
for i in range(1,n):
    if s[i-1] == 'A' and s[i] =='C':
        sum[i+1] = sum[i] + 1
    else:
        sum[i+1] = sum[i]

#指定された範囲の中のACの数を出力
for i in range(q):
    ans = sum[r[i]]-sum[l[i]]
    print(ans)


累積和を格納する配列sum(長さ = n+1)を作る。
A C が並んだときにsumに1足される。

#累積和を求める
sum = [0]*(n+1)
for i in range(1,n):
    sum[i+1] = sum[i]
    if s[i-1] == 'A' and s[i] =='C':
        sum[i+1] = sum[i+1] + 1

↑累積和の求め方の記述は
この書き方のほうがシンプル by chokudaiさん


最初に自分で解いてLETだったやつ。

# -*- coding: utf-8 -*-

n, q  = map(int,input().split())

s = input()

for i in range(q):
    l, r  = map(int,input().split())
    a = 0
    for j in range(l-1,r-1):
        if s[j] == 'A' and s[j+1] =='C':
            a = a+1
    print(a)

累積和というのを勉強しないとACにはならなそう。

-D. [AC] We Like AGC

問題ページ【D - We Like AGC
chokudauさんの解説(C++)をpython3で書き直した。

# -*- coding: utf-8 -*-

N = int(input())

# A C G T を
# 0 1 2 3 と置く

dp = [[[[0 for i in range(4)] for j in range(4)] for k in range(4)] for l in range(101)]
dp[0][3][3][3] = 1

mod = 10**9+7

#文字列の文字数
for len in range(N):
    #最後から1文字目の文字
    for c1 in range(4):
        #最後から2文字目の文字
        for c2 in range(4):
            #最後から3文字目の文字
            for c3 in range(4):
                #新しく追加する文字
                for a in range(4):
                    if c2 == 0 and c1 == 1 and a == 2 :
                        continue #012
                    if c2 == 1 and c1 == 0 and a == 2 :
                        continue #102
                    if c2 == 0 and c1 == 2 and a == 1 :
                        continue #021
                    if c3 == 0 and c1 == 1 and a == 2 :
                        continue #0?12
                    if c3 == 0 and c2 == 1 and a == 2 :
                        continue #01?2
                    
                    dp[len + 1][c2][c1][a] += dp[len][c3][c2][c1]
        
ans = 0

#最後から1文字目の文字
for c1 in range(4):
    #最後から2文字目の文字
    for c2 in range(4):
        #最後から3文字目の文字
        for c3 in range(4): 
            ans += dp[N][c3][c2][c1]

print(ans % mod)

詳しい解説ページ
naolllab.hatenablog.com



今回のコンテスト後のレート
f:id:naolllab:20190325152750j:plain