hdu4901 枚举状态(找集合对S(xor) ==T(and))
题意:
给你一个串数字,然后让你在这里面挑取两个集合S ,T,集合的要求是
(1)不能为空
(2)S集合的所有元素必须在T集合的左边
(3)S集合的XOR == T集合的AND
问可以找到多少组这样的集合对。
思路:
两种方法,一个是枚举T集合的第一个元素,或者是枚举S集合的最后一个元素,首先我们开四个数组
sum_xor[1002][2050] 记录从左到右直到第i个节点的时候的j这个数字有多少种可能
now_xor[1002][2050] 记录从左到右直到第i个节点并且必须选择i这个节点时j出现的次数
sum_and[1002][2050] 同理.(只不过是n-->1)..
now_and[1002][2050] 同理. (只不过是n-->1)..
更新数组的时候可以想象下01背包,当前的状态由上一步的所有可能状态和当前的这个数字组合出来后得到的新状态,对于sum_..记得加上上一步的所有状态,这个题目关键就是枚举的时候不能出现重复的集合对。然后我们枚举一遍就ok了,两种枚举方法,第一种是sum_xor,now_and两个状态组合,另一
个是now_xor ,sum_and组合,给个关键的代码
for(i = 1 ;i <= n ;i ++)
{
now_xor[i][num[i]] ++;//自己这个状态
sum_xor[i][num[i]] ++;//自己这个状态
for(j = 0 ;j <= 2048 ;j ++)
{
if(sum_xor[i-1][j])//如果之前有j这个状态
{
now_xor[i][j^num[i]] += sum_xor[i-1][j];//新状态的增加值
sum_xor[i][j^num[i]] += sum_xor[i-1][j];//新状态的增加值
sum_xor[i][j] += sum_xor[i-1][j];//当前的和也要加上之前的所有可能和
//然后都MOD一下
}
}
}
AND的同理...
求出来这4个数组之后的两种枚举方法(两种几乎一样)
(1)枚举T集合的第一个
for(i = 2 ;i <= n ;i ++)
{
for(j = 0 ;j <= 2048 ;j ++)
if(sum_xor[i-1][j] && now_and[i][j])
ans = (sum_xor[i-1][j] * now_and[i][j]) % MOD;
}
(2)枚举S集合的最后一位
for(i = 1 ;i <= n - 1 ;i ++)
{
for(j = 0 ;j <= 2048 ;j ++)
if(now_xor[i-1][j] && sum_and[i][j])
ans = (now_xor[i-1][j] * sum_and[i][j]) % MOD;
}
#include<stdio.h>
#include<string.h> #define MOD (1000000000 + 7)
__int64 sum_xor[1002][2050] ,now_xor[1002][2050];
__int64 sum_and[1002][2050] ,now_and[1002][2050];
__int64 num[1002]; int main ()
{
int i ,j ,n ,t;
scanf("%d" ,&t);
while(t--)
{
scanf("%d" ,&n);
for(i = 1 ;i <= n ;i ++)
scanf("%I64d" ,&num[i]);
memset(sum_xor ,0 ,sizeof(sum_xor));
memset(now_xor ,0 ,sizeof(now_xor));
for(i = 1 ;i <= n ;i ++)
{
sum_xor[i][num[i]] ++;
now_xor[i][num[i]] ++;
for(j = 0 ;j <= 2048 ;j ++)
if(sum_xor[i-1][j])
{
now_xor[i][j^num[i]] += sum_xor[i-1][j];
sum_xor[i][j^num[i]] += sum_xor[i-1][j];
sum_xor[i][j] += sum_xor[i-1][j];
now_xor[i][j^num[i]] %= MOD;
sum_xor[i][j^num[i]] %= MOD;
sum_xor[i][j] %= MOD;
}
}
memset(sum_and ,0 ,sizeof(sum_and));
memset(now_and ,0 ,sizeof(now_and));
for(i = n ;i >= 1 ;i --)
{
sum_and[i][num[i]] ++;
now_and[i][num[i]] ++;
for(j = 0 ;j <= 2048 ;j ++)
if(sum_and[i+1][j])
{
now_and[i][j&num[i]] += sum_and[i+1][j];
sum_and[i][j&num[i]] += sum_and[i+1][j];
sum_and[i][j] += sum_and[i+1][j];
now_and[i][j&num[i]] %= MOD;
sum_and[i][j&num[i]] %= MOD;
sum_and[i][j] %= MOD;
}
}
__int64 ans = 0;
for(i = 2 ;i <= n ;i ++)
{
for(j = 0 ;j <= 2048 ;j ++)
if(sum_xor[i-1][j] && now_and[i][j])
ans = (ans + sum_xor[i-1][j] * now_and[i][j]) % MOD;
}
printf("%I64d\n" ,ans);
}
return 0;
}
hdu4901 枚举状态(找集合对S(xor) ==T(and))的更多相关文章
- { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型
MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...
- 1315E Double Elimination DP 01枚举状态和倍增思想
E. Double Elimination DP 01枚举状态和倍增思想 题意 参考DOTA2双败赛制,一共有\(2^n\)个队打n轮 其中你有k喜欢的队伍,由你掌控比赛的输赢请问比赛中包含你喜欢的队 ...
- 6-12 varchar和char 枚举类型enum 集合set
1 字符类型char和varchar #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参 ...
- Mysql数据类型《三》枚举类型与集合类型
枚举类型与集合类型 字段的值只能在给定范围中选择,如单选框,多选框 enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female set 多选 在给定的范围内可以选择一个或一 ...
- mysql枚举类型与集合类型
枚举类型与集合类型 字段的值只能在给定范围中选择,如单选框,多选框 enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female set 多选 在给定的范围内可以选择一个或一 ...
- 【POJ 2411】【Mondriaans Dream】 状压dp+dfs枚举状态
题意: 给你一个高为h,宽为w的矩阵,你需要用1*2或者2*1的矩阵填充它 问你能有多少种填充方式 题解: 如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成 ...
- Delphi基本类型--枚举 子界 集合 数组
[plain] view plain copy <strong>根据枚举定义集合 </strong> TMyColor = (mcBlue, mcRed); TMyColorS ...
- Http状态码集合
忘了之前在哪里收集的了,先表示感谢. 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请 ...
- HDU 5025Saving Tang Monk BFS + 二进制枚举状态
3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...
随机推荐
- MVC base64加密的文件,前端下载
后端代码: public FileResult OutPutFile(string base64file,string filename) { buffer = Convert.FromBase64 ...
- Nginx常见的错误配置
Blog:博客园 个人 翻译自Common Nginx misconfigurations that leave your web server open to attack Nginx是当前主流的W ...
- CodeBlocks的安装配置以及使用教程
CodeBlocks的安装配置以及使用教程 教程写的很啰嗦,本来几句话就能搞定的,但为了照顾到那部分真正的小白还请大家见谅! 一.下载 前往CodeBlocks官网下载带编译器的版本,目前的最新版本为 ...
- 如何自学成 Python 大神?这里有些建议
人生苦短,我用 Python.为什么?简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状:网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲解基础知 ...
- WPF 基础 - xaml 语法总结
Attribute 与 Property 之间的区别 Property 对应着抽象对象身上的性状: Attribute 是针对标签的特征: 往往一个标签具有的 Attribute 对于它所代表的对象的 ...
- Nacos常用配置
属性配置 1. 配置年级是否显示 这里配置的屏蔽的年级,在运营后台去删掉相关id就行了 2. 过滤标签显示特定课程数据 指定 yaml 文件显示 course.tagCourse.tagName=寒假 ...
- Git详解和Github的使用
Git和Github的概念: Git是分布式版本管理系统,简单说就是一个软件,用于记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的软件. Github是一个为用户提供Git服务的网站,简单说 ...
- Pytorch数据读取与预处理实现与探索
在炼丹时,数据的读取与预处理是关键一步.不同的模型所需要的数据以及预处理方式各不相同,如果每个轮子都我们自己写的话,是很浪费时间和精力的.Pytorch帮我们实现了方便的数据读取与预处理方法,下面记录 ...
- Android Studio 之创建自定义控件
•前言 常用控件和布局的继承结构,如下图所示: 可以看到,我们所用的所有的控件都是直接或者间接的继承自View的: 所用的所有布局都是直接或者间接继承自ViewGroup的: View 是 Andro ...
- 自己挖的坑自己填--jxl进行Excel下载堆内存溢出问题
今天在进行使用 jxl 进行 Excel 下载时,由于数据量大(4万多条接近5万条数据的下载),数据结构过于负责,存在大量大对象(虽然在对象每次用完都设置为null,但还是存在内存溢出问题),加上本地 ...