题目描述:
老师给了小信 n 个只包含小写字母的字符串和一个数 k。每个字符串中,每种字母都只出现一次。
小信要从小写字母表(a-z)里选一些字母,且任意选择一些给定的字符串,使得选择的串里都恰好有 k 个字符串包含小信选的各个字母。请问他最多能选几个字母?
输入格式:
第一行包含两个整数 n,k,表示字符串数和给定的数。
接下来n行,每行包含一个只含小写字母的字符串。保证在每个字符串中,每种字母都只出现一次。
输出格式:
输出一个整数表示答案。
超级DFS。
#include<bits/stdc++.h>
using namespace std;
int n,k;
char a[20][30];
int l[20];
int t[20][30];
int tt[30];
int ans;
void dfs(int x){
if(x>n){
int cnt=0;
for(int i=0;i<=25;i++){
if(tt[i]==k){
cnt++;
ans=max(ans,cnt);
}
}
return;
}
for(int i=1;i<=l[x];i++){
tt[a[x][i]-'a']++;
}
dfs(x+1);
for(int i=1;i<=l[x];i++){
tt[a[x][i]-'a']--;
}
dfs(x+1);
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%s",a[i]+1);
l[i]=strlen(a[i]+1);
for(int j=1;j<=l[i];j++){
t[i][a[i][j]-'a']++;
}
}
dfs(1);
printf("%d",ans);
return 0;
}