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: