http://acm.hdu.edu.cn/showproblem.php?pid=3006

题意

给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14。问由给出的集合可以组成多少个不同的集合。

分析

因为m最大为14位,那么可以把一个集合压缩成一个数,每个元素对应二进制的一个位。所有状态最大为(1<<m)。用个数组记录出现的状态,用map实测超时。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<queue>
  5. #include<vector>
  6. #include<cstdio>
  7. #include<algorithm>
  8. #include<map>
  9. #include<set>
  10. #include<bitset>
  11. #define rep(i,e) for(int i=0;i<(e);i++)
  12. #define rep1(i,e) for(int i=1;i<=(e);i++)
  13. #define repx(i,x,e) for(int i=(x);i<=(e);i++)
  14. #define X first
  15. #define Y second
  16. #define PB push_back
  17. #define MP make_pair
  18. #define mset(var,val) memset(var,val,sizeof(var))
  19. #define scd(a) scanf("%d",&a)
  20. #define scdd(a,b) scanf("%d%d",&a,&b)
  21. #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
  22. #define pd(a) printf("%d\n",a)
  23. #define scl(a) scanf("%lld",&a)
  24. #define scll(a,b) scanf("%lld%lld",&a,&b)
  25. #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
  26. #define IOS ios::sync_with_stdio(false);cin.tie(0)
  27.  
  28. using namespace std;
  29. typedef long long ll;
  30. template <class T>
  31. void test(T a){cout<<a<<endl;}
  32. template <class T,class T2>
  33. void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
  34. template <class T,class T2,class T3>
  35. void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
  36. const int N = 1e6+;
  37. //const int MAXN = 210;
  38. const int inf = 0x3f3f3f3f;
  39. const ll INF = 0x3f3f3f3f3f3f3f3fll;
  40. const ll mod = ;
  41. int T;
  42. void testcase(){
  43. printf("Case #%d: ",++T);
  44. }
  45. const int MAXN = +;
  46. const int MAXM = 5e5+;
  47. int ma[MAXM];
  48. int main() {
  49. #ifdef LOCAL
  50. freopen("in.txt","r",stdin);
  51. #endif // LOCAL
  52. int n,m,x,y,value;
  53. while(~scdd(n,m)){
  54. mset(ma,);
  55. int ans=;
  56. for(int i=;i<n;i++){
  57. scd(x);
  58. value=;
  59. for(int j=;j<x;j++){
  60. scd(y);
  61. value+=(<<(y-));
  62. }
  63. ma[value]=;
  64. for(int j=;j <= (<<m) ;j++){
  65. if(ma[j]){
  66. ma[j|value]=;
  67. }
  68. }
  69.  
  70. }
  71.  
  72. for(int i=;i<=(<<m);i++) if(ma[i]) ans++;
  73. cout<<ans<<endl;
  74. }
  75. return ;
  76. }

HDU - 3006 The Number of set(状态压缩位运算)的更多相关文章

  1. uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)

    这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...

  2. hdu3006 状态压缩+位运算+hash(小想法题)

    题意:        给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路:       是个小想法题目,要用到二进制压缩,位运算, ...

  3. hdu 4057 AC自己主动机+状态压缩dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...

  4. HDU 3006 The Number of set(位运算 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...

  5. HDU 1074 Doing Homework (dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...

  6. hdu 4336 Card Collector(期望 dp 状态压缩)

    Problem Description In your childhood, people in the famous novel Water Margin, you will win an amaz ...

  7. HDU 5724 Chess(SG函数+状态压缩)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5724 题意: 现在有一个n*20的棋盘,上面有一些棋子,双方每次可以选择一个棋子把它移动到其右边第一 ...

  8. HDU 5025 Saving Tang Monk 【状态压缩BFS】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...

  9. HDU 5418——Victor and World——————【状态压缩+floyd】

    Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Other ...

随机推荐

  1. [CB]IPv6 在中国 - 大规模部署进行中 进展明显

    IPv6 在中国 - 大规模部署进行中 进展明显 2019年02月04日 08:21 3078 次阅读 稿源:solidot 0 条评论 中国有着世界上最大的网民人口,但它的 IPv6 普及度却处于世 ...

  2. BZOJ3996[TJOI2015]线性代数——最小割

    题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 输入 第一行输入一个整数N,接下来N行输入B矩阵, ...

  3. BZOJ2553[BeiJing2011]禁忌——AC自动机+概率DP+矩阵乘法

    题目描述 Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平.而后,Koishi恢复了读心的能力…… 如今,在John已经成为传 ...

  4. Linux定时器crontab的使用

    参数 Usage: crontab [参数] 文件 crontab [参数] crontab -n [主机名] Options: -u <user> 定义用户 -e 编辑工作表 -l 列出 ...

  5. POJ3122-Pie-二分答案

    有N个派,F+1个人,每个人分到的体积要相等,而且每个人只能有一块派. 二分答案,对于一个mid,对每个派进行检测,尽量的多分,然后如果份数比F+1大,说明mid可以更大,就把mid给low.注意份数 ...

  6. lightoj1038(数学期望dp)

    题意:输入一个数N,N每次被它的任意一个因数所除 变成新的N 这样一直除下去 直到 N变为1 求变成1所期望的次数 解析: d[i] 代表从i除到1的期望步数:那么假设i一共有c个因子(包括1和本身) ...

  7. python 和 scikit-learn 实现垃圾邮件过滤

    文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注.目前,在机器学习模型的帮助下,包括情绪分析,文件分类,话题分类,文 ...

  8. Java NIO -- 通道 Channel

    通道(Channel):由 java.nio.channels 包定义的.Channel 表示 IO 源与目标打开的连接.Channel 类似于传统的“流”.只不过 Channel本身不能直接访问数据 ...

  9. Android应用程序签名详解

    http://blog.csdn.net/lyq8479/article/details/6401093 本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名.为什么要给应用程序签名 ...

  10. 总算知道怎样从ImageMagick生成的数据转换成HICON: MagickGetImageBlob & LookupIconIdFromDirectoryEx

    MagickSetImageFormat(mw, "ICO"); //设置这个后, MagickGetImageBlob 才能返回正确的值 size_t length; PBYTE ...