题目链接

题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标。S中所有数按位异或后的值要与T中所有的数按位与的值相同,问能找出多少符合要求的组合。

思路 :比赛的时候有点没有头绪,后来二师兄想出了状态转移方程,YN又改了很多细节,最后才A的。总之是个别扭的DP。。。。。

一开始是 _xor[i][j^a[i]] += _xor[i-1][j] ;j 的下一个状态 就是异或上a[i],这个数组所代表的意思是,前 i 个数中选取某些数(必须包括 i )组成的集合按位异或得到j^a[i]

但是发现这样会重复,因为对于对于S和T的选取的元素,下标前后没有明显的界限,从前往后找与从后往前找,两厢重复。后来就重新设了一个数组去存以前的所有的值:

_xor[i][j^a[i]] += xort[i-1][j] ;
xort[i][j] = _xor[i][j] + xort[i-1][j] ;//这个表达式,代表这前 i 个中选取了某些数(必须选了 i )异或后的值为j的情况加上前 i -1个选某些值异或后的值为 j 。其实就是选与不选 i 的两种情况相加,组成的就是前 i 个中选取某些数异或出 j 所组成的情况,此时的 i 可选可不选。

 //
#include <cstring>
#include <cstdio>
#include <iostream>
typedef long long LL ;
const long long mod = ;
using namespace std ; int a[] ;
LL _xor[][],xort[][],_and[][],andt[][] ; void Init()
{
memset(_xor,,sizeof(_xor)) ;
memset(xort,,sizeof(xort)) ;
memset(_and,,sizeof(_and)) ;
memset(andt,,sizeof(andt)) ;
memset(a,,sizeof(a)) ;
}
int main()
{
int T,n ;
cin >> T ;
while(T -- )
{
cin >> n ;
Init() ;
for(int i = ; i < n ; i++)
cin >> a[i] ;
_xor[][a[]] = xort[][a[]] = ;
for(int i = ; i < n ; i++)
{
for(int j = ; j < ; j ++)
{
_xor[i][j^a[i]] += xort[i-][j] ;
_xor[i][j^a[i]] %= mod ;
}
_xor[i][a[i]] ++ ;
for(int j = ; j < ; j++)
{
xort[i][j] = _xor[i][j] + xort[i-][j] ;
xort[i][j] %= mod ;
}
}
_and[n-][a[n-]] = andt[n-][a[n-]] = ;
for(int i = n- ; i >= ; i--)
{
for(int j = ; j < ; j++)
{
_and[i][j&a[i]] += andt[i+][j] ;
_and[i][j&a[i]] %= mod ;
}
_and[i][a[i]] ++ ;
for(int j = ; j < ; j++){
andt[i][j] = andt[i+][j] + _and[i][j] ;
andt[i][j] %= mod ;
}
}
LL ans = ;
for(int i = ; i < n- ; i++)
{
for(int j = ; j < ; j++)
{
ans += (_xor[i][j] * andt[i+][j]) % mod ;
ans %= mod ;
}
}
cout << ans << endl ;
}
return ;
}

2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)的更多相关文章

  1. 2014多校第七场1005 || HDU 4939 Stupid Tower Defense (DP)

    题目链接 题意 :长度n单位,从头走到尾,经过每个单位长度需要花费t秒,有三种塔: 红塔 :经过该塔所在单位时,每秒会受到x点伤害. 绿塔 : 经过该塔所在单位之后的每个单位长度时每秒都会经受y点伤害 ...

  2. 2014多校第六场 1005 || HDU 4925 Apple Tree

    题目链接 题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两 ...

  3. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

    题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...

  4. 2014多校第三场1005 || HDU 4891 The Great Pan(模拟)

    题目链接 题意 : 给你n行字符串,问你有多少种理解方式.有两大类的理解 (1){A|B|C|D|...}代表着理解方式可以是A,可以是B或C或者D. (2)$blah blah$,在$$这两个符号中 ...

  5. hdu 4901 The Romantic Hero (dp)

    题目链接 题意:给一个数组a,从中选择一些元素,构成两个数组s, t,使s数组里的所有元素异或 等于 t数组里的所有元素 位于,求有多少种构成方式.要求s数组里 的所有的元素的下标 小于 t数组里的所 ...

  6. HDU 4901 The Romantic Hero

    The Romantic Hero Time Limit: 3000MS   Memory Limit: 131072KB   64bit IO Format: %I64d & %I64u D ...

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

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

  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. 2014多校第十场1004 || HDU 4974 A simple water problem

    题目链接 题意 : n支队伍,每场两个队伍表演,有可能两个队伍都得一分,也可能其中一个队伍一分,也可能都是0分,每个队伍将参加的场次得到的分数加起来,给你每个队伍最终得分,让你计算至少表演了几场. 思 ...

随机推荐

  1. 细说Debug和Release区别

    VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...

  2. GestureDetector.OnGestureListener

    为了加强鼠标响应事件,Android提供了GestureDetector手势识别类.通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single Ta ...

  3. 嗨分享-前端技术-帝国CMS手机站修改列表分页(sysShowListMorePage)

    http://bbs.phome.net/showthread-31-318753-0.html 如果你的网站使用的是帝国CMS.PC站和手机站各使用一个模板组,但共同使用一个数据库.那么你的PC站和 ...

  4. java数据结构和算法------冒泡排序

    package iYou.neugle.sort; public class Bubble_sort { public static void BubbleSort(double[] array) { ...

  5. 2. VS使用---HelloWorld

    摘要: ------------------------------------------------------------------------------------- 1. VS2010里 ...

  6. Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类

    Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类 内容大纲 加性高斯白噪声信道(AWGN)下的digital调制格式识别分类 (1. PSK; 2. QPSK; 3.8 ...

  7. 目前国内外主流的linux发行版本

    1.linux其实是基于unix发展而来的,还有mac os也是类unix操作系统 2.目前主流的linux发行版本主要有:红帽系列(中国大陆,美洲地区,发源于美国),suse系列(欧洲地区流行,发源 ...

  8. C++中的运算符重载注意事项

    1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...

  9. JBOSS和WebLogic区别

    JBoss: 1.  JBoss开放源代码Java EE实现,成本低,好控制. 2.  JBoss需要的内存和硬盘空间比较小,但是只适合做小项目. 3.  安装非常简单.先解压缩JBoss打包文件再配 ...

  10. xml基础学习笔记02

    接着上次的xml笔记01 ,记录一下如何DOM创建xml 一.由于没有特意来写博客,都是在程序中用注释的方法记录笔记,整理过来难免格式错误,排版什么的,大家好事看不懂就仔细看给出的代码加上注释,一定会 ...