SRM427 div2 hard
全探索。
a,c,i,n,tは必ず学ばなければならないので別にして、他の文字はbitで探索。
ACRushさんは
for(int set=mask;1;set=(set-1)&mask)
って書いてた、賢い。
#include <string> #include <vector> using namespace std; class Teaching { public: int popCount(int n) { int r=0; for(int i=0;i<30;i++) if(n & (1<<i)) r++; return r; } bool acint(char c) { return (c=='a' || c=='c' || c=='i' || c=='n' || c=='t'); } int c2i(char c) { int abc[26],r=0; for(int i=0;i<26;i++) abc[i]=(acint('a'+i))?0:1; for(int i=0;i<=c-'a';i++) r+=abc[i]; return r-1; } int count(vector <string> words, int K) { int n=words.size(); if(K<5) return 0; K-=5; vector<int> w(n,0); for(int i=0;i<n;i++) for(int j=0;j<(int)words[i].size();j++) if(!acint(words[i][j])) w[i]|=(1<<c2i(words[i][j])); int ans=0; for(int learn=0;learn<(1<<21);learn++) if(popCount(learn)==K) { int aa=0; for(int i=0;i<n;i++) if((w[i]&learn)==w[i]) aa++; ans=max(ans,aa); } return ans; } };