Official
C - Just K Editorial by PCTprobability
\(N\) 個の文字列のうち、いくつか選ぶ方法は \(2^N\) 通りあります。
この全てに対して、「選んだ文字列の中でちょうど \(K\) 個の文字列に登場する英小文字」の種類数を求めて最大値を出力すればよいです。
計算量は \(\mathrm{O}(2^N \times N \times σ)\) となります。ただし、\(σ\) は英小文字の種類数です。
実装の際には、それぞれの文字列を選ぶかどうかを \(N\) 桁の \(2\) 進数とみなし、\(0\) 以上 \(2^N-1\) 以下の整数と対応させる bit 全探索と呼ばれている手法が便利です。
実装例#include <bits/stdc++.h>
using namespace std;
int main() {
int n,k;
cin>>n>>k;
vector<string> s(n);
for(int i=0;i<n;i++) cin>>s[i];
int ans=0;
for(int i=0;i<(1<<n);i++){
vector<int> sum(26);
for(int j=0;j<n;j++){
if((i>>j)&1){
for(int x=0;x<s[j].size();x++) sum[s[j][x]-'a']++;
}
}
int now=0;
for(int j=0;j<26;j++) if(sum[j]==k) now++;
ans=max(ans,now);
}
cout<<ans<<endl;
}
posted:
last update: