【BZOJ3866】The Romantic Hero “再不刷它就土了”系列

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42612069

其实我就是觉得原创的访问量比未授权盗版多有点不爽233。。。

话说其实我并不知道它会不会变成土豪题。

应该会吧?先刷了吧。

题意:

给出一个数列,然后取一个两个子序列A、B,

使得A严格在B前面。

然后要求A的异或和(^)等于B的与和(&)。

题解:

动规。

注意判重。。没什么好注意的,不判重样例都过不去233。

啊。下午好颓废~~~不爽啊~~~这道题算是随便签个到吧?

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1050
#define MOD 1000000007
using namespace std;
int f[N][N],g[N][N],h[N][N],n;
int a[N];
int main()
{
//	freopen("test.in","r",stdin);
	int i,j,k,T;
	for(scanf("%d",&T);T--;)
	{
		scanf("%d",&n);
		f[0][0]=1;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			for(j=0;j<1024;j++)f[i][j]=f[i-1][j],h[i][j]=0;
			for(j=0;j<1024;j++)
			{
				f[i][j^a[i]]+=f[i-1][j],f[i][j^a[i]]%=MOD;
				h[i][j^a[i]]+=f[i-1][j],h[i][j^a[i]]%=MOD;
			}
		}
		memset(g[n+1],0,sizeof(g[n+1]));
		g[n+1][1023]=1;
		for(i=n;i;i--)
		{
			for(j=0;j<1024;j++)g[i][j]=g[i+1][j];
			for(j=0;j<1024;j++)g[i][j&a[i]]+=g[i+1][j],g[i][j&a[i]]%=MOD;
		}
		for(i=1;i<=n;i++)f[i][0]--,g[i][1023]--;
		long long ans=0;

		for(i=1;i<n;i++)
			for(j=0;j<1024;j++)ans+=(long long)h[i][j]*g[i+1][j],ans%=MOD;
		printf("%lld\n",ans);
	}
	return 0;
}
时间: 2024-12-05 09:50:36

【BZOJ3866】The Romantic Hero “再不刷它就土了”系列的相关文章

【BZOJ3850】【HDU4882】ZCC Loves Codefires 数论,叉积,贪心 “再不刷它就土了”系列

转载请注明出处http://blog.csdn.net/vmurder/article/details/42848881 这样如果转载瞎了读者还能看到干净的原文~~ 毕竟是HDU收录的题,,我怀疑它要变土.. 题意: 有n个项目,然后第一行输入损失度,第二行输入耗时 然后安排一下顺序, 每一项的消耗为当前已经做了的(包括此项)总时间*损失度. 求最小总消耗. 首先这道题是贪心,我们可以贪心排序项目. 策略: bool operator < (const YYC &a)const {retur

【BZOJ3894】文理分科 最小割 (再不刷它就土了,毕竟水题)

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43968955"); } 啦啦啦啦Markdown啊 啦啦啦啦怎么用啊 啦啦啦啦公式板啊 还是别用Markdown啦 呜啊~~ 上面的自己唱出来的留言板举爪~ 好了,说题解. 嗯自己看代码build部分吧,就是这么的暴力! #include

hdu 4901 The Romantic Hero (dp+背包问题)

题意: 有n个数,从n个数中选出两个集合s和集合t,保证原序列中,集合s中的元素都在 集合t中元素的左边.且要求集合s中元素做抑或运算的值与集合t中元素做与运算的 值相等.问能选出多少种这样的集合s和t. 算法: 左右dp. 用dp[i][j]表示前i个数 做抑或运算得到j的方法数.最后一个值取不取到都不一定. 故为背包的问题.右边也是一样. 枚举时可能出现重复.枚举到第i个和枚举第i+1个可能重复.所以要枚举一个中间值. 这个中间值是归到s集的,因为抑或支持逆运算,而与是不支持的. 所以最后d

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

题目地址:HDU 4901 这题没想到最后居然能够做出来.... 这题用了两次DP,先从前往后求一次异或的,再从后往前求一次与运算的.分别是 1:求异或的时候,定义二维数组huo[1000][1024],前者指第几位,后者是哈希的思想,若huo[x][y]=2则表示最右边的数为第x位时,异或值为y的出现了两次,需要再定义一个hash数组,来保存前面出现的所有情况,再找有多少位的时候,用hash数组中出现的所有的值与当前的第x位的数字进行异或. 2:求与的时候,定义二维数组yu[1000][102

HDU4901:The Romantic Hero(DP)

Problem Description There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and can't refus

HDOJ 4901 The Romantic Hero

DP....扫两遍组合起来 The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 547    Accepted Submission(s): 217 Problem Description There is an old country and the king fell in love with a

HDU 4901 The Romantic Hero(DP)

HDU 4901 The Romantic Hero 题目链接 题意:给定一个序列,要求找一个分界点,然后左边选一些数异或和,和右边选一些数且和相等,问有几种方法 思路:dp,从左往右和从右往左dp,求出异或和且的个数,然后找一个分界点,使得一边必须在分界点上,一边随意,然后根据乘法原理和加法原理计算 代码: #include <cstdio> #include <cstring> typedef __int64 ll; const int N = 1024; const int

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

The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1675    Accepted Submission(s): 705 Problem Description There is an old country and the king fell in love with a devil. The de

HDU 4901 The Romantic Hero

The Romantic Hero Time Limit: 3000MS   Memory Limit: 131072KB   64bit IO Format: %I64d & %I64u Description 开头背景介绍无用 There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the k