题目描述:输入一个大小为\(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. Linux环境下安装SVN

    最近在研究svn的代码如何迁移到GitLab,因此借助本文,重新来回顾温习下svn的安装使用. 一.SVN的安装 svn的安装很简单,在互联网的环境,直接执行以下命令行即可. yum install ...

  2. 全面学习 Python 包:包的构建与分发

    首发于公众号:Python编程时光 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而 ...

  3. python PIL图像处理库

    1. Introduction PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. ...

  4. CSS两列布局

    方法1:左边设置绝对定位,右边设置左外边距,大小和左边的宽度相等 //CSS部分: .contain{ position :relative; height: 300px; } .left{ posi ...

  5. Python线性回归算法【解析解,sklearn机器学习库】

    一.概述 参考博客:https://www.cnblogs.com/yszd/p/8529704.html 二.代码实现[解析解] import numpy as np import matplotl ...

  6. 一个97年测试妹纸的成长经历,转正直接涨薪2K

    这篇文章,涉及测试团队管理.测试流程建设.测试从业者能力成长.优秀测试从业者的状态.以及同样是两年的Tester,为何他人如此优秀 . 一切的一切,都是有原因的 . 期望这篇文章,对关注「简尚」公号的 ...

  7. 迷你商城后台管理系统————stage2核心代码实现

    应用程序主函数接口 @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall.db", "o ...

  8. Java中创建线程主要有三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  9. 《Exceptioning团队》第六次作业:团队项目系统设计改进与详细设计

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握面向对象软件设计方法:2.完善系统设计 ...

  10. 【Python】编程小白的第一本python(基础中的基础)

    一.变量 如果不知道变量是什么类型,可以通过type()函数来查看类型,在IDE中输入: print(type(word)) 另外,由于中文注释会导致报错,所以需要在文件开头加一行魔法注释 #codi ...