题目描述:输入一个大小为\(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【线性基,构造】的更多相关文章

  1. Codeforces 1163E Magical Permutation [线性基,构造]

    codeforces 思路 我顺着图论的标签点进去的,却没想到-- 可以发现排列内每一个数都是集合里的数异或出来的. 考虑答案的上界是多少.如果能用小于\(2^k\)的数构造出\([0,2^k-1]\ ...

  2. CF1163E Magical Permutation(线性基,构造)

    虽然做起来有一点裸……但是就是想不到啊…… 首先令 $d_i=p_i\oplus p_{i-1}$,那么 $d_i$ 都是 $S$ 中的数,$a_i=d_i\oplus d_{i-1}\oplus \ ...

  3. 51Nod1577 异或凑数 线性基 构造

    国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...

  4. CF1163E Magical Permutation

    题意:给定集合,求一个最大的x,使得存在一个0 ~ 2x - 1的排列,满足每相邻的两个数的异或值都在S中出现过.Si <= 2e5 解:若有a,b,c,令S1 = a ^ b, S2 = b ...

  5. BZOJ3569: DZY Loves Chinese II(线性基构造)

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生.   今Dzy有一魞歄图, ...

  6. bzoj 4004 [JLOI2015]装备购买 拟阵+线性基

    [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 547[Submit][Status][Dis ...

  7. 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\ ...

  8. 【HDU 3949】 XOR (线性基,高斯消元)

    XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. 高斯消元 & 线性基【学习笔记】

    高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...

随机推荐

  1. azkban从编译开始安装

    从git上下载最新的azkban稳定版代码 git clone https://github.com/azkaban/azkaban.git -b 3.74.3 这里还有个问题,如何把这个代码放到自己 ...

  2. 使用jQuery开发tree插件

    1.插件截图 2.插件使用 首先引入jquery库,然后引入tree.js.tree.css文件,如下: <script type="text/javascript" src ...

  3. 不能在本机启动SQL Server服务错误代码126(要在协议里面禁用所有别的VIA,是怎么回事?)

    在启动数据库sql服务的时候提示[Windows 不能在 本地计算机 启动 SQL Server . 有关更多信息,查阅系统事件日志.如果这是非 Microsoft 服务,请与服务厂商联系,并参考特定 ...

  4. 获取项目中所有URL--获取swagger上展示的接口信息

    有时我们需要接口的一些基本信息,比如接口请求路径,接口请求方式等,我们用这些信息来做判断,或者入库. 我在开发接口权限的时候就遇到了这个问题,之前写的接口很多,现在需要将这些接口信息存到数据库中, 用 ...

  5. Core Animation笔记(- Layer 基本属性)

    一.Layer的基本属性 1. contents 图层内容默认为nil 可以指定一张图片作为内容展示 self.layerView.layer.contents = (__bridge id)imag ...

  6. 从汇编语言写到c语言

    好了,言归正传,裸机程序没有操作系统的支持,想要用c语言,就只能先使用汇编语言手动配置c语言需要的环境,听起来很高大上,其实需要做的很简单:指定堆栈指针的值就好. 那么完成这个简单的事情之前,先要明白 ...

  7. 朴素贝叶斯算法源码分析及代码实战【python sklearn/spark ML】

    一.简介 贝叶斯定理是关于随机事件A和事件B的条件概率的一个定理.通常在事件A发生的前提下事件B发生的概率,与在事件B发生的前提下事件A发生的概率是不一致的.然而,这两者之间有确定的关系,贝叶斯定理就 ...

  8. with读、写文件

    1.with写文件 save_file = "1.txt" str_data = "123a\nbc" with open(save_file, 'a', en ...

  9. layui 单选框、复选框、下拉菜单 不显示问题 记录

    1. 如果是 ajax嵌套了 页面, 请确保  只有最外层的页面引入了 layui.css 和 layui.js 内层页面 切记不要再次引入 2. layui.use(['form', 'upload ...

  10. 时间模块time和datetime的使用

    日期和时间 一 time模块 import time 时间的表示形式: 时间戳 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现 ...