ABC249C - Just K

考え方

以下と同じ考えで解ける.
ABC246F - typewriter - 競プロはじめました

文字列を26bitで管理し,$N$個のうちどの文字列を選ぶかをbit全探索する.

すべての場合について,26文字が何回出てくるかカウントする.最後に,$K$回出てくる個数を数えれば良い.

回答例

N, K = map(int, input().split())
S = [input() for _ in range(N)]

cnt = [0] * 26
for i in range(N):
    for s in S[i]:
        cnt[i] |= 1 << (ord(s) - ord('a'))

ans = 0
for bit in range(1 << N):
    tmp = [0] * 26
    for i in range(N):
        if bit >> i & 1:
            for j in range(26):
                tmp[j] += cnt[i] >> j & 1
    tmp2 = 0
    for j in range(26):
        if tmp[j] == K:
            tmp2 += 1
    ans = max(ans, tmp2)

print(ans)

考えてみたら,文字列を26bitで持つ必要はない...
以下のように簡略化できる.

N, K = map(int, input().split())
S = [input() for _ in range(N)]

ans = 0
for bit in range(1 << N):
    cnt = [0] * 26
    for i in range(N):
        if bit >> i & 1:
            for s in S[i]:
                cnt[ord(s) - ord('a')] += 1
    cntK = 0
    for j in range(26):
        if cnt[j] == K:
            cntK += 1
    ans = max(ans, cntK)

print(ans)