Atcoder ABC249 振り返り
最近土日に用事が重なってリアルタイム参加出来てません……
A - Jogging【AC】
毎秒進むか停止するかを判断し,X秒までシミュレーションして進んだ距離が大きい方を表示します.
A, B, C, D, E, F, X = map(int, input().split()) takahashi = 0 aoki = 0 for i in range(X): if i % (A+C) < A: takahashi += B if i % (D+F) < D: aoki += E if takahashi > aoki: print("Takahashi") elif takahashi < aoki: print("Aoki") else: print("Draw")
B - Perfect String【AC】
全ての文字が相異なるという条件があります.これは,文字列をsetにとり元の文字列と長さを比較すれば良いです.同じ文字列があったらsetでは同じ文字列は消されるので元の文字列より短くなります.
次に大文字と小文字の判定をします.upperとlowerというフラグ変数を用意し,始め両方Falseにしておきます.大文字があったらupper=True, 小文字があったらlower=Trueとします.大文字しか無かったり小文字しかない文字列だったらどちらかがFalseのままなのでそこで判定すれば良いです.
S = list(input()) if len(set(S)) != len(S): print("No") else: upper = False lower = False for s in S: if s.isupper(): upper = True if s.islower(): lower = True if upper and lower: print("Yes") else: print("No")
C - Just K【AC】
Nが15と小さいため全探索しても間に合うと判断出来ます.bit全列挙を使うとシンプルに書くことが出来ます.
0か1がN個並んだ数字について,iが1ならi番目の文字列を選ぶ,iが0なら選ばないというようにします.このとき0から2^Nまでの数字を2進数化すると,001, 010, 011, 100, 101, 110, 111のように,選ぶ選ばないのパターンを全て列挙することが出来ます.
i >> jというのは,iをjビット右に移動するという意味です.例えば,3 >> 1なら011を1ビット右に移動するので01となります.i & jはandです.iが1かつjが1の時に1,それ以外の時に0を返します.iが何行もある場合,一番右端のビットについてandが計算されます.
つまり,(i >> j) & 1はiのj番目のビットが1なら1を,0なら0を返す処理になります.j番目が1なら文字列を選ぶので,リストに入れるというような処理を書けばいいです.
ビットによって選ぶ文字列を選択出来たら,各文字が何個あるかを辞書で数えて,Kと等しいものの数を解とします.各文字列最大でも26文字しかないので,s.count(s_list)==Kでも判定できるかなと思いましたがTLEとなりました.
N, K = map(int, input().split()) S_list = [input() for _ in range(N)] ans = 0 for i in range(2**N): s_list = [] for j in range(N): if (i >> j) & 1 == 1: s_list += list(S_list[j]) ans_cand = 0 dic = {} for s in s_list: dic.setdefault(ord(s), 0) dic[ord(s)] += 1 for v in dic.values(): if v == K: ans_cand += 1 ans = max(ans, ans_cand) print(ans)