考え方
以下と同じ考えで解ける.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)