HDU4025 Equation of XOR [二分+状态压缩]
ai取值范围0~1,xi取值范围0~3,所以最后异或的结果不会超过两位二进制。所以可以用一个60位的数保存30个式子的值,然后m的范围是小于22,二分一下就可以了,4^11=4*10^6,结果存下来排个序然后二分找一下就可以了。
#include <stdio.h> #include <string.h> #include <algorithm> typedef __int64 LL; int cas,n,m,ai[35][30],si[30][4]; LL ans,tmp[1<<22+2]; int sum[1<<22+2]; int size,nsize;int binser(LL x){int low=0,high=size,mid;for(;;){mid=(low+high)/2;if(mid==low)break;if(tmp[mid]<=x)low=mid;else high=mid;}return tmp[mid]==x?sum[mid]:0; } LL cal(int p,int x){LL ans=0;for(int i=1;i<=n;i++)ans=(ans<<2)+(ai[i][p]*x);return ans; } void dfs(int p,LL now,int full,int id){if(p>full)id==0?tmp[size++]=now:ans+=binser(now);else for(int i=1;i<=si[p][0];i++)dfs(p+1,now^cal(p,si[p][i]),full,id); } int main(){//freopen("test.in","r",stdin);scanf("%d",&cas);while(cas--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&ai[i][j]);for(int i=1;i<=m;i++){scanf("%d",&si[i][0]);for(int j=1;j<=si[i][0];j++){scanf("%d",&si[i][j]);}}ans=size=0;int halfm=m/2;dfs(1,0LL,halfm,0);std::sort(tmp,tmp+size);nsize=size,size=1,sum[0]=1;for(int i=1;i<nsize;i++){if(tmp[i]!=tmp[i-1]){tmp[size]=tmp[i],sum[size]=1,size++;}else sum[size-1]++;}dfs(halfm+1,0LL,m,1);printf("%I64d\n",ans);}return 0; }
转载于:https://www.cnblogs.com/swm8023/archive/2012/08/27/2659363.html
HDU4025 Equation of XOR [二分+状态压缩]相关推荐
- CodeForces - 1288D Minimax Problem(二分+状态压缩)
题目链接:点击查看 题目大意:给出一个n*m的矩阵,我们用maze[n][m]来表示每一个元素,现在我们需要选出其中 i 和 j 两行,i 和 j 可以相同,用这两行的元素构成一个新的数组a,构造规则 ...
- HDU - 6749 Mosquito(二分+状态压缩+最大流)
题目链接:点击查看 题目大意:给出一个 n * m 的房间,再给出 k 个蚊子窝(保证蚊子窝在边界上),每个蚊子窝内有数只蚊子,单位时间内蚊子可以移动一个单位的曼哈顿距离,蚊子们都是非常聪明的,问最少 ...
- 解题报告(一)D、(CROC 2016 - Final Round C)Binary Table(矩阵 + 状态压缩 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- hdu 3681(bfs+dfs+状态压缩)
解题思路:这道题属于图上来回走的问题,可以把重复走的过程弱化,即只强调从u->v的结果,中间经过的节点都不考虑.这道题里面'G','F','Y'是重要的节点,其余的点我们是可以忽略的,也就是说, ...
- 状态压缩DP(大佬写的很好,转来看)
奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...
- LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)
文章目录 1. 题目 2. 解题 2.1 回溯 2.2 状态压缩DP 1. 题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] ...
- 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划
例1 骑士(Sgu223) 1592:[例 1]国王 信息学奥赛一本通(C++版)在线评测系统 https://blog.csdn.net/guoyangfan_/article/details/82 ...
- HDU-4539 郑厂长系列故事——排兵布阵 状态压缩DP Or 最大团
题意:给定一个方格,然后告诉你一些规则,这些规则下方格中的有些位置是相冲突的.问在方格中最多能够放置多少个士兵. 分析:比赛时一开始就想着用状态压缩DP来搞,不过忘了相邻三行产生关系同样可以通过添加状 ...
- 状态压缩技巧:动态规划的降维打击
刷题认准labuladong 东哥带你手把手撕力扣???? 点击下方卡片即可搜索???? 我们号之前写过十几篇动态规划文章,可以说动态规划技巧对于算法效率的提升非常可观,一般来说都能把指数级和阶乘级时 ...
最新文章
- java中位与运算符_Java中位运算符和的区别
- *LOJ#2085. 「NOI2016」循环之美
- 报名领奖|云栖大会,10月19-22日杭州不见不散!
- 去掉桌面快捷方式小箭头的方法
- 一部论述修养人生处世出世的集录_读《菜根谭》,人生本是修心的过程
- 当代家长现状。。 | 今日最佳
- 第一百二十一期:当新闻报道用上AR 技术,能为读者带来什么?
- Stateflow变量范围
- java异常看不懂_报错了 看不懂求解
- GDI+简单现实文字旋转
- SpringCloud观后感
- 【Tensorflow教程笔记】常用模块 tf.data :数据集的构建与预处理
- Flink 第8.2章 Flink 的键组 KeyGroup 与 缩放 Rescale
- 定时线程池实现请求合并
- hive和presto计算日期时间差
- 全球100位人工智能名人和2500名资深AI人士,将聚首深圳
- 微信小程序 --- 不在以下合法域名列表中请参考文档
- python执行方式和设置_03-Python执行方式和Pycharm设置
- 写毕业论文期间的一些收获和感想
- c语言单身狗题目罩得住学长,我家系统用爱发电