https://vjudge.net/problem/HDU-4901

题意

给n个数,构造两个集合,使第一个集合的异或和等于第二个集合的相与和,且要求第一个集合的元素下标都小于第二个集合的元素下标。问方案数

分析

dp来做。dp1[i][j]表示0~i的元素异或和为j的个数。dp2[i][j]表示i~n-1的元素相与和为j的个数。注意状态转移时要同时计算第i个数参与或不参与的情况,且dp1的第一维不能取到n-1,类似的,dp2的第一维不能取0。统计最终答案时需要合并,那么怎么才能防止重复呢?这时再添加dp3[i][j]表示i~n-1的元素相与和为j的个数(i在集合中)。这样枚举i时,就能保证不重复不遗漏了。

  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.  
  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 = ;
  47. int dp1[MAXN][MAXN], dp2[MAXN][MAXN], dp3[MAXN][MAXN];
  48. int a[MAXN];
  49.  
  50. int main(){
  51. #ifdef LOCAL
  52. freopen("data.in","r",stdin);
  53. #endif // LOCAL
  54. int T, n, i, j, t;
  55. scanf("%d",&T);
  56. while(T--) {
  57. scanf("%d",&n);
  58. for(i = ; i < n; i++)
  59. scanf("%d",&a[i]);
  60. memset(dp1, , sizeof(dp1));
  61. memset(dp2, , sizeof(dp2));
  62. memset(dp3, , sizeof(dp3));
  63. dp1[][a[]] = ;
  64. for(i = ; i < n - ; i++) {
  65. dp1[i][a[i]]++; //单独一个元素构成一个集合
  66. for(j = ; j < MAXN; j++) {
  67. if(dp1[i-][j]) {
  68. dp1[i][j] += dp1[i-][j]; //不添加第i个元素进行异或,继承之前算好的
  69. dp1[i][j] %= mod;
  70.  
  71. t = j ^ a[i]; //添加第i个元素进行异或
  72. dp1[i][t] += dp1[i-][j];
  73. dp1[i][t] %= mod;
  74. }
  75. }
  76. }
  77. dp2[n-][a[n-]] = ;
  78. dp3[n-][a[n-]] = ;
  79. for(i = n-; i > ; i--) {
  80. dp2[i][a[i]]++;
  81. dp3[i][a[i]]++; //单独一个元素构成一个集合
  82. for(j = ; j < MAXN; j++) {
  83. if(dp2[i+][j]) {
  84. dp2[i][j] += dp2[i+][j]; //不添加第i个元素进行按位与
  85. dp2[i][j] %= mod;
  86.  
  87. t = j & a[i]; //添加第i个元素进行按位与
  88. dp2[i][t] += dp2[i+][j];
  89. dp2[i][t] %= mod;
  90.  
  91. dp3[i][t] += dp2[i+][j]; //添加第i个元素进行按位与
  92. dp3[i][t] %= mod;
  93. }
  94. }
  95. }
  96. int ans = ;
  97. for(i = ; i < n - ; i++) {
  98. for(j = ; j < MAXN; j++) {
  99. if(dp1[i][j] && dp3[i+][j]) {
  100. ans += (ll(dp1[i][j]) * dp3[i+][j] % mod);
  101. ans %= mod;
  102. }
  103. }
  104. }
  105. printf("%d\n", ans);
  106.  
  107. }
  108. return ;
  109. }

HDU - 4901 The Romantic Hero(dp)的更多相关文章

  1. 2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)

    题目链接 题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标.S中所有数按位异或后的值要与T中所有的数按位 ...

  2. HDU 4901(杭电多校训练#3 1005题)The Romantic Hero(DP)

    题目地址:HDU 4901 这题没想到最后竟然可以做出来.. .. 这题用了两次DP,先从前往后求一次异或的.再从后往前求一次与运算的. 各自是 1:求异或的时候,定义二维数组huo[1000][10 ...

  3. HDU 4901 The Romantic Hero (计数DP)

    The Romantic Hero 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/E Description There is ...

  4. HDU 4901 The Romantic Hero(二维dp)

    题目大意:给你n个数字,然后分成两份,前边的一份里面的元素进行异或,后面的一份里面的元素进行与.分的时候依照给的先后数序取数,后面的里面的全部的元素的下标一定比前面的大.问你有多上种放元素的方法能够使 ...

  5. HDU 1864 最大报销额(DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others) ...

  6. HDU 2639 Bone Collector II (dp)

    题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...

  7. HDU 4562 守护雅典娜(dp)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

  8. HDU 4901 The Romantic Hero 题解——S.B.S.

    The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  9. HDU - 6199 gems gems gems (DP)

    有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...

随机推荐

  1. JavaScript解决一个带验证的Form两个Submit事件(一个页面保持不动【AJAX实现】,一个页面提交并跳转)的场景

    <form class="form-horizontal" action="/biz/patent/edit" method="post&quo ...

  2. multer处理post请求的代码演示

    let express = require('express'); let multer = require('multer'); let mObj = multer({dest:__dirname+ ...

  3. 使用非服务器磁盘(MBROnly)安装ESXi时的方法.

    From ESXi 5.0, if you install ESXi to a empty hard disk, the target disk will be prepared with GPT-b ...

  4. mongoose 入门基本操作

    简介 Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具 那么要使用它,首先你得装上node.js和mongodb,关于mongodb的安装和操作介绍可以参考:ht ...

  5. Ionic package Error: Registry returned 404 for GET on

    Ionic package Error: Registry returned 404 for GET on https://registry.npmjs.org/org.apache.cordova. ...

  6. vue实现带规格商品的表格编辑

    实现效果: 需求分析: 商品分为 启用规格 和 未启用规格 两种状态, 启用时显示带规格表格, 不启用时显示无规格价格 规格大项最多添加两个, 比如 "颜色", "尺寸& ...

  7. codeforces431B

    Shower Line CodeForces - 431B Many students live in a dormitory. A dormitory is a whole new world of ...

  8. MySQL中char、varchar和nvarchar的区别

    一.char和varchar的区别char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度.1). 当字符串长度小于255时,用额 ...

  9. String在内存中如何存储(Java)

    JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...

  10. String类型的特殊之处

    String是一种特殊的引用类型,那么它究竟特殊在哪里? 请看看下面这个程序,输出什么结果? public static void changeStr(String str) { str = &quo ...