CF1163E Magical Permutation【线性基,构造】
题目描述:输入一个大小为\(n\)的正整数集合\(S\),求最大的\(x\),使得能构造一个\(0\)到\(2^x-1\)的排列\(p\),满足\(p_i\oplus p_{i+1}\in S\)
数据范围:\(n,S_i\le 2^{18}\)
什么?NTF在很多年前就把这东西给切了?
首先要把\(S\)缩成一个大小为\(x\)的线性无关组,而且每个数\(<2^x\),这样就可以构造出\(p\)了。(之后再说)
直接丢进线性基里就可以了吗?不行,应该是把\(<2^x\)的数全部加进去之后,看是不是填满了(有\(x\)个数),填满了就可以。
那现在的问题是怎么构造\(p\),发现每个\(d_i=p_i\oplus p_{i+1}\in S\),所以\(p_i\)是由\(S\)的子集异或出来的,而\(S\)是线性无关组就能保证异或出来的两两不同(恰有\(2^x\)个数)且无法更大。
所以就要构造\(S\)的子集构成的序列,使得相邻两个只差一个元素。有一个很妙的方法,先递归到两边分别计算(\([0,2^{x-1})\)和\([2^{x-1},2^x)\)),然后给右半边异或上\(S_x\)就可以满足这个条件了。
#include<bits/stdc++.h>
#define Rint register int
using namespace std;
const int N = 1 << 18;
int n, m, k, cnt, S[N], ans[N], x[19], a[19];
inline void insert(int val){
int tmp = val;
for(Rint i = 18;~i;i --)
if((val >> i) & 1){
if(x[i]) val ^= x[i];
else {x[i] = val; a[i] = tmp; ++ cnt; return;}
}
}
inline void dfs(int dep){
if(dep == -1) return;
dfs(dep - 1); ans[++ m] = a[dep]; dfs(dep - 1);
}
int main(){
scanf("%d", &n);
for(Rint i = 1;i <= n;i ++) scanf("%d", S + i);
sort(S + 1, S + n + 1);
for(Rint i = 1, j = 1;j < 19;j ++){
while(i <= n && S[i] < (1 << j)) insert(S[i ++]);
if(cnt == j) k = j;
}
printf("%d\n", k);
dfs(k);
for(Rint i = 0;i < (1 << k);i ++){
if(i) ans[i] ^= ans[i - 1];
printf("%d ", ans[i]);
}
}
CF1163E Magical Permutation【线性基,构造】的更多相关文章
- Codeforces 1163E Magical Permutation [线性基,构造]
codeforces 思路 我顺着图论的标签点进去的,却没想到-- 可以发现排列内每一个数都是集合里的数异或出来的. 考虑答案的上界是多少.如果能用小于\(2^k\)的数构造出\([0,2^k-1]\ ...
- CF1163E Magical Permutation(线性基,构造)
虽然做起来有一点裸……但是就是想不到啊…… 首先令 $d_i=p_i\oplus p_{i-1}$,那么 $d_i$ 都是 $S$ 中的数,$a_i=d_i\oplus d_{i-1}\oplus \ ...
- 51Nod1577 异或凑数 线性基 构造
国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...
- CF1163E Magical Permutation
题意:给定集合,求一个最大的x,使得存在一个0 ~ 2x - 1的排列,满足每相邻的两个数的异或值都在S中出现过.Si <= 2e5 解:若有a,b,c,令S1 = a ^ b, S2 = b ...
- BZOJ3569: DZY Loves Chinese II(线性基构造)
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图, ...
- bzoj 4004 [JLOI2015]装备购买 拟阵+线性基
[JLOI2015]装备购买 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 547[Submit][Status][Dis ...
- Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)
题目链接 \(Description\) 给定两个长为\(n\)的数组\(x_i,y_i\).每次你可以选定\(i,j\),令\(x_i=x_i\ \mathbb{xor}\ x_j\)(\(i,j\ ...
- 【HDU 3949】 XOR (线性基,高斯消元)
XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 高斯消元 & 线性基【学习笔记】
高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...
随机推荐
- 使用Jenkins自带功能(不用shell)构建Docker镜像并推送到远程仓库
意义: 一开始实现这个目的是在Jenkins中使用的shell脚本,也就是如下的这个: bash # 进入到生成jar包的根目录 cd ${WORKSPACE}/${module_filename} ...
- 【转载】Windows安装Redis并添加本地自启动服务
概况 在windows本地搭建redis缓存,添加到本地计算机的服务中,保证每次开机自动启动服务. 第一步:下载redis(我的是计算机win10,64位) https://github.com/Mi ...
- 跨域访问MVC
using MvcApp.Filters; using System; using System.Collections.Generic; using System.Linq; using Syste ...
- selenium的显示等待和隐式等待的区别
什么是显示等待和隐式等待?显示等待就是有条件的等待隐式等待就是无条件的等待 隐式等待 当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出 ...
- php文件路径处理函数
basename -- 返回路径中的文件名部分 # 语法 string basename ( string $path [, string $suffix ] ) //> 手册例子 echo & ...
- 增强学习--TRPO算法
理论部分参考 推导 数学上的分析 代码
- python接口自动化13-data和json参数傻傻分不清
前言 在发post请求的时候,有时候body部分要传data参数,有时候body部分又要传json参数,那么问题来了:到底什么时候该传json,什么时候该传data? 一.识别json参数 1.在前面 ...
- Linux cat命令使用方法
今天小编为大家带来cat的使用方法命令:catcat 命令用于连接文件并打印到标准输出设备上.使用权限所有使用者 语法格式cat [-AbeEnstTuv] [–help] [–version] fi ...
- [nginx][tls] nginx配置https与ssl/tls的sni的方法
一 https的sni配置方法 http { } server { listen 443 ssl; server_nam ...
- C++(三十七) — 字符串的函数重载—案例
1.MyString.h 头文件 #pragma once #include <iostream> using namespace std; class MyString { public ...