博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4901 The Romantic Hero(dp)
阅读量:6932 次
发布时间:2019-06-27

本文共 1401 字,大约阅读时间需要 4 分钟。

题目大意:给定一个序列,要求选出两个集合,S和T,要求S中选中的元素的下标都要小于T中元素的下标。

而且说S中元素的亦或和要等于T中元素取且的和。

解题思路:dp, 思路非常好想。就是细节比較恶心。

#include 
#include
#include
using namespace std;typedef __int64 ll;const int maxn = 1024;const ll MOD = 1e9+7;int n, num[maxn];ll l[maxn][maxn+10][2], r[maxn][maxn+10];void init () { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &num[i]);}ll solve () { memset(l, 0, sizeof(l)); memset(r, 0, sizeof(r)); for (int i = 1; i < n; i++) { l[i][num[i]][1]++; for (int j = 0; j < maxn; j++) { l[i+1][j][1] = (l[i][j^num[i+1]][1] + l[i][j^num[i+1]][0]) % MOD; l[i+1][j][0] = (l[i][j][1] + l[i][j][0]) % MOD; } } for (int i = n; i; i--) { r[i][num[i]]++; for (int j = 0; j < maxn; j++) { r[i-1][j] = (r[i-1][j] + r[i][j]) % MOD; r[i-1][j&num[i-1]] = (r[i-1][j&num[i-1]] + r[i][j]) % MOD; } } ll ans = 0; for (int i = 1; i < n; i++) { for (int j = 0; j < maxn; j++) { /* if (l[i][j] * r[i+1][j]) printf("%d %d %lld %lld\n", i, j, l[i][j], r[i+1][j]); */ ans = (ans + l[i][j][1] * r[i+1][j] % MOD) % MOD; } } return ans;}int main () { int cas; scanf("%d", &cas); while (cas--) { init(); printf("%I64d\n", solve()); } return 0;}

转载地址:http://bumjl.baihongyu.com/

你可能感兴趣的文章
Tcp的三次握手四次挥手
查看>>
flink1.3.3 on hdp 2.6(hadoop 2.7.3)部署指南
查看>>
LoadRunner监控Linux资源监控
查看>>
我的友情链接
查看>>
linux删除大文件后空间没释放的问题
查看>>
google打不开?更改一下chrome设置,畅通无阻玩谷歌
查看>>
RedHat 5.4 Squid配置本地代理服务器
查看>>
Poco官方PPT_030-MemoryManagement双语对照翻译
查看>>
ExpandableListView可展开列表
查看>>
升级moss sp1后User Profile Service Application 报错问题解决
查看>>
PHP新手上路
查看>>
常量指针和指针常量
查看>>
IT人员看待和预防×××十大建议
查看>>
linksys rv042配置client to gateway ***
查看>>
[李景山php]每天TP5-20170118|thinkphp5-Paginator.php
查看>>
使用PHP+Swoole实现的网页即时聊天工具
查看>>
KISS 原则 [ 设计原则 ]
查看>>
Java执行命令行命令的工具类RuntimeUtil
查看>>
webpy session debug 模式下无法使用
查看>>
【linux基础】05、linux文件系统基础
查看>>