1.题目链接。给定n个集合,使用这些集合组成新的集合,问可以组成多少种新集合。
2.之前做过一个类似的问题,使用的是bitset状压集合。其实这个题目意思也差不多。可以看出来,m<=14.也就是说数其实很小,最多:1<<14位。然后我们用一个数就可以状压这个集合,并集其实就是两个数求或。对于每加入一个新的集合,我们把它状压乘一个数,然后和之前得到的集合取个或生成新的集合,这样最后统计一下答案即可。
#include<bits/stdc++.h>
using namespace std;
#pragma warning(disable:4996)
int vis[1 << 14];
int main()
{
int n, m;
while (~scanf("%d%d", &n, &m))
{
memset(vis, 0, sizeof(vis));
for (int i = 0;i < n; i++)
{
int k;
scanf("%d", &k);
int tem = 0;
int j;
for (j = 0; j < k; j++)
{
int z;
scanf("%d", &z);
tem+= 1 << (z - 1);
}
vis[tem] = 1;
for (int k = 1; k < (1 << 14); k++)
{
if (vis[k])
vis[tem | k] = 1;//这个地方是集合的并集
}
}
int ans = 0;
for (int i =1; i < 1 << 14; i++)
{
if (vis[i])
ans++;
}
printf("%d\n", ans);
}
}