hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

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)