P3812 【模板】线性基
P3812 【模板】线性基
题目描述
给定
输入格式
第一行一个数
接下来一行
输出格式
仅一行,表示答案。
提示
Solution:
想写P3857 [TJOI2008] 彩灯 的解题报告,但是发现我线性基模板题的解题报告都没写。所以我来补线性基了捏。
先要知道线性基是什么,它通常用来解决一些数任选
然后我们再来说一下
在插入一个数
如果
但是如果
线性基的本质其实是将这些数的本质不同的 XOR 和用一个 n 维的基底表示出来,那么为了满足贪心,我们应该保证基底的每一维
又因为异或运算满足结合律和交换律,所以我们就可以认为为上述式子对于两个及以上的数构造线性基时都是成立的。也就是说,现在我们通过线性基构造出了所有可能的异或和的结果。然后我们只需要在答案统计时将
Code:
#include<bits/stdc++.h> #define int long long using namespace std; const int N=100; int n; int d[N],qpow[N]; void init() { qpow[0]=1; for(int i=1;i<=60;i++) { qpow[i]=qpow[i-1]<<1; } } void ins(int x) { for(int i=60;i>=0;i--) { if(x&qpow[i]) { if(!d[i]) { d[i]=x; break; } else { x^=d[i]; } } } return ; } int query_max() { int ans=0; for(int i=60;i>=0;i--) { if((ans^d[i])>ans)ans=ans^d[i]; } return ans; } void work() { init(); cin>>n; for(int i=1,x;i<=n;i++) { scanf("%lld",&x); ins(x); } int ans=query_max(); printf("%lld",ans); } #undef int int main() { work(); }