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
今回のコンテスト後のレート