【题目大意】:给出n个集合,每个集合的元素不少于1个不多于m个。每个集合元素有k种,问最后能组成多少种新的集合。
【解题思路】:注意到m只有14.我们可以用二进制表述出所有集合出现的情况,现在只需要枚举所有集合出现的情况,在和题目给定的集合进行来判断是否能够构成就可以了。
【代码】:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
using namespace std;
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long
int n,m;
int ans,a[105];
int main(){
while(~scanf("%d%d",&n,&m)) {
for (int i=0; i<n; i++) {
a[i]=0;
int v,tmp;
scanf("%d",&tmp);
for (int j=0; j<tmp; j++) {
scanf("%d",&v);
a[i]|=1<<(v-1);
}
}
int tmp;
ans=0;
for (int i=1; i<(1<<m); i++){
tmp=0;
for(int j=0; j<n; j++)
if((i|a[j])==i){
tmp|=a[j];
if(tmp==i){
ans++;
break;
}
}
}
cout << ans << endl;
}
return 0;
}