\(\text{Problem}\)

小H是个善于思考的学生,她正在思考一个有关序列的问题。

她的面前浮现出了一个长度为 \(n\) 的序列 \({ai}\),她想找出两个非空的集合 \(S、T\)。

这两个集合要满足以下的条件:

两个集合中的元素都为整数,且都在 \([1, n]\) 里,即 \(Si,Ti ∈ [1, n]\)。

对于集合 \(S\) 中任意一个元素 \(x\),集合 \(T\) 中任意一个元素 \(y\),满足 \(x < y\)。

对于大小分别为 \(p, q\) 的集合 \(S\) 与 \(T\),满足 \(\text{a[s1] xor a[s2] xor a[s3] ... xor a[sp] = a[t1] and a[t2] and a[t3] ... and a[tq]}\).

小H想知道一共有多少对这样的集合 \((S,T)\),你能帮助她吗?

\(\text{Solution}\)

显然 \(dp\)

一般想到的是 \(f_{i,j}\) 表示顺着做到 \(i\) 位异或值为 \(j\) 的方案数,\(g_{i,j}\) 则是倒着 \(and\) 的方案数

那么枚举临界点计算即可

但是由于正解要压位高精,占据空间,是得分着做很悬

于是考虑一个神奇的 \(dp\)

注意它的 \(j\) 表示倒着做 \(and\) 完后继续那这个值 \(xor\) 后的 \(j\)

所以答案是 \(f[p][0][2]\)

\(p\) 表示使用滚动数组最后得到的状态

转移只要考虑当前位选不选即可

\(\text{Code}\)

#include<cstdio>
#include<iostream>
using namespace std; const int N = 1005, P = 1e8;
int n, a[N]; struct node{
int m[40] = {};
}f[2][1024][3]; inline node operator + (node a, node b)
{
node c;
c.m[0] = max(a.m[0], b.m[0]);
for(int i = 1; i <= c.m[0]; i++)
{
c.m[i] += a.m[i] + b.m[i];
c.m[i + 1] += c.m[i] / P, c.m[i] %= P;
}
if (c.m[c.m[0] + 1] > 0) ++c.m[0];
return c;
} int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
f[0][1023][0].m[0] = f[0][1023][0].m[1] = 1;
int p = 0;
for(int i = n; i; i--)
{
for(int j = 0; j < 1024; j++) f[p ^ 1][j][0] = f[p][j][0], f[p ^ 1][j][1] = f[p][j][1],
f[p ^ 1][j][2] = f[p][j][2];
for(int j = 0; j < 1024; j++)
{
f[p ^ 1][j & a[i]][1] = f[p ^ 1][j & a[i]][1] + f[p][j][0] + f[p][j][1];
f[p ^ 1][j ^ a[i]][2] = f[p ^ 1][j ^ a[i]][2] + f[p][j][2] + f[p][j][1];
}
p ^= 1;
}
if (f[p][0][2].m[0] == 0){printf("0\n"); return 0;}
printf("%d", f[p][0][2].m[f[p][0][2].m[0]]);
for(int i = f[p][0][2].m[0] - 1; i; i--) printf("%08d", f[p][0][2].m[i]);
}

JZOJ 3889的更多相关文章

  1. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  2. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  3. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  4. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  5. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  6. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  7. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  8. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

  9. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

  10. [jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. ...

随机推荐

  1. Django框架三板斧本质-jsonResponse对象-form表单上传文件request对象方法-FBV与CBV区别

    目录 一:视图层 2.三板斧(HttpResponse对象) 4.HttpResponse() 5.render() 6.redirect() 7.也可以是一个完整的URL 二:三板斧本质 1.Dja ...

  2. 获取Exceptionless的日志

    简言: 最近做项目要用到Exceptionless这个分布式日志组件,由于领导说日志需要提供给客户看,废话不多讲,咱直入主题了: 第一步:查看API文档 打开:http://127.0.0.1:500 ...

  3. PyTorch复现AlexNet学习笔记

    PyTorch复现AlexNet学习笔记 一篇简单的学习笔记,实现五类花分类 这里只介绍复现的工作,如果想了解更多有关网络的细节,请去看论文<ImageNet Classification wi ...

  4. 使用linux的ffmpeg进行B站直播推流

    很久之前买了个友善的开发板R2S,一直在家吃灰.最近看到网上有用ffmpeg进行直播推流的案例,想把吃灰的的开发板利用起来,于是有了这篇教程. 第一步:安装ffmpeg sudo apt update ...

  5. VUE 使用md5对用户登录密码进行加密传输

    VUE 使用md5对用户登录密码进行加密传输到数据库 前言 第一步 npm下载js-md5依赖包 第二步 引入js-md5 直接在需要使用md5加密的页面引入 全局挂载,将js-md5添加到vue原型 ...

  6. wsl2 kali修改语言

    直接执行sudo dpkg-reconfigure locales 会提示 dpkg-query: package 'locales' is not installed and no informat ...

  7. [OpenCV实战]27 在OpenCV下使用forEach进行并行像素访问

    目录 1 Mat像素访问 1.1 使用at方法直接进行像素访问 1.2 使用指针进行像素访问 1.3 使用forEach方法进行像素访问 1.4 将forEach与C ++ 11 Lambda一起使用 ...

  8. Ynoi 数据结构题选做

    Ynoi 数据结构题选做 前言 我将成为数据结构之神!坚持 lxl 党的领导,紧随 nzhtl1477(女装灰太狼1477)的脚步.无论过去.现在还是未来,分块始终是实现 data structure ...

  9. python进阶之路17 包的使用、collections、time、random模块

    包 大白话: 多个py文件的集合>>>:文件夹 专业:内部含有__init__.py文件的文件夹(python2 必须要求 python3无所谓) 包的具体使用 虽然python3对 ...

  10. [Untiy]贪吃蛇大作战(五)——游戏主界面

    接着上一节: 4.AI蛇的设计 这里AI蛇大部分代码都可以参照主角的代码,我这里的实现其实还可以进行改进.基本原理就是蛇创建之后给蛇一个随机方向的单位向量,AI蛇的蛇头添加一个比蛇头大两三倍大小的碰撞 ...