很巧妙的用位的方法来表示集合 用位运算的方法,集合a和集合b的并 就是a|b 然后简单模拟即可 /* * File: main.cpp * Author: liuwei * * Created on September 27, 2010, 1:58 PM */ #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; bool pan[1 << 15]; int main(int argc, char** argv) { int n, m; while (EOF != scanf("%d%d", &n, &m)) { int i; int tmp; memset(pan, false, sizeof (pan)); for (i = 0; i < n; ++i) { int k; scanf("%d", &k); int s = 0; while (k--) { scanf("%d", &tmp); s |= (1 << tmp); } pan[s] = true; int j; for (j = 0; j < (1 << (m + 1)); ++j) if(pan[j]) { pan[j|s] = true; } } int end = (1 << (m + 1)); int sum(0); for (i = 0; i < end; ++i) if (pan[i]) ++sum; printf("%d/n", sum); } return 0; }