#include <cstdio>
#include <cstring>
const int Len=;
const int Maxn=;
int cnt,Ans,b,x,n;
inline int Max(int x,int y) {return x>y?x:y;}
struct Node {int next[];}Tree[Maxn*Len];
void Insert(int x)
{
int Now=; bool k;
for (int i=Len;i>=;i--)
{
k=x&(<<i);
if (Tree[Now].next[k]==-) Tree[Now].next[k]=++cnt;
Now=Tree[Now].next[k];
}
}
int Query(int x)
{
int Now=,v=; bool k;
for (int i=Len;i>=;i--)
{
k=x&(<<i);
if (Tree[Now].next[!k]!=-) k=!k;
v=v|(k<<i);
Now=Tree[Now].next[k];
}
return v;
}
int main()
{
// freopen("c.in","r",stdin);
while (scanf("%d",&n)!=EOF)
{
Ans=cnt=; memset(Tree,-,sizeof(Tree));
for (int i=;i<=n;i++)
{
scanf("%d",&x);
Insert(x);
Ans=Max(Ans,x^Query(x));
}
printf("%d\n",Ans);
}
return ;
}

CSU1216

在n个数取两个Xor最大。用0-1Trie.

 #include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
LL n,Ans,Base[];
struct Node{LL a,b;}A[];
inline bool cmp(Node A,Node B) {return A.b>B.b;} int main()
{
scanf("%lld",&n);
for (LL i=;i<=n;i++) scanf("%lld%lld",&A[i].a,&A[i].b);
sort(A+,A+n+,cmp); Ans=;
for (LL i=;i<=n;i++)
{
for (LL j=;j>=;j--)
if (A[i].a>>j&)
{
if (!Base[j])
{
Base[j]=A[i].a;
break;
}
A[i].a^=Base[j];
}
if (A[i].a) Ans+=A[i].b;
}
printf("%lld\n",Ans);
return ;
}

BZOJ2460

若子集异或为0,则集合一定不为线性基。从大到小排序,贪心即可。

 #include <cstdio>
#include <iostream>
using namespace std;
#define LL long long
const LL Maxn=;
LL a[Maxn],Kase,n,Ans,k,q,Bin[];
inline void Swap(LL &x,LL &y) {LL t=x;x=y;y=t;}
inline LL Get(LL Row,LL k)
{
if (Row<n)
{if (k==) return ; else k--;}
if (k>=Bin[Row]) return -;
LL Ret=;
for (int i=;i<=Row;i++)
if (k&Bin[Row-i]) Ret^=a[i];
return Ret;
}
int main()
{
scanf("%I64d",&Kase);
Bin[]=; for (int i=;i<=;i++) Bin[i]=Bin[i-]<<;
for (LL kase=;kase<=Kase;kase++)
{
printf("Case #%I64d:\n",kase);
scanf("%I64d",&n);
for (LL i=;i<=n;i++) scanf("%I64d",&a[i]);
LL Now=;
for (LL i=Bin[];i;i>>=)
{
LL j=Now+;
while (!(i&a[j])&&j<=n) j++;
if (j==n+) continue;
++Now; Swap(a[Now],a[j]);
for (j=;j<=n;j++)
{
if (j==Now) continue;
if (a[j]&i) a[j]=a[j]^a[Now];
}
}
scanf("%I64d",&q);
for (LL i=;i<=q;i++)
{
scanf("%I64d",&k);
printf("%I64d\n",Get(Now,k));
}
}
return ;
}

HDU3949

求第K大的Xor和,求出线性基,把K转为二进制在Xor就可以了

 #include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
const LL Mod=;
const LL Maxn=;
struct Node{LL b[Maxn],c;}a[Maxn];
LL Base[Maxn],cnt,Ans,n,m;
inline LL Pow(LL x,LL y)
{
LL Ret=;
while (true)
{
if (y&) Ret=(Ret*x)%Mod;
x=(x*x)%Mod; y>>=;
if (y==) break;
}
return Ret;
}
inline bool cmp(Node A,Node B) {return A.c<B.c;}
int main()
{
scanf("%lld%lld",&n,&m);
for (LL i=;i<=n;i++)
for (LL j=;j<=m;j++) scanf("%lld",&a[i].b[j]);
for (LL i=;i<=n;i++) scanf("%lld",&a[i].c);
sort(a+,a+n+,cmp);
for (LL i=;i<=n;i++)
{
bool flag=false;
for (LL j=;j<=m;j++)
if (a[i].b[j])
{
if (!Base[j])
{
Base[j]=i; flag=true;
break;
}
LL t=Mod-(a[i].b[j]*Pow(a[Base[j]].b[j],Mod-))%Mod;
for (LL k=j;k<=m;k++)
a[i].b[k]=(a[i].b[k]+(t*a[Base[j]].b[k])%Mod)%Mod;
}
if (flag) Ans+=a[i].c,cnt++;
}
printf("%lld %lld\n",cnt,Ans);
return ;
}

BZOJ4004

即求出线性基,然后贪心取即可。

 #include <cstdio>
#include <cstring>
#define LL long long
inline void Get_Int(LL & x)
{
char ch=getchar(); x=;
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') {x=x*+ch-'';ch=getchar();}
}
inline void Swap(LL &x,LL &y) {LL t=x;x=y;y=t;}
inline LL Max(LL x,LL y) {return x>y?x:y;}
inline LL Min(LL x,LL y) {return x>y?y:x;}
//==================================================
const LL Maxn=;
LL head[Maxn],father[Maxn][],Dep[Maxn],n,m,Bin[],x,u,v,cnt,Sum;
bool vis[Maxn];
struct Edge{LL to,next;}edge[Maxn<<];
struct Base
{
LL a[];
inline void Clr() {memset(a,,sizeof(a));}
inline void Insert(LL x)
{
for (LL i=;i>=;i--)
if (Bin[i]&x)
{
if (!a[i]) {a[i]=x; return;}
x^=a[i];
}
}
};
Base f[Maxn][],Ans;
inline void Add(LL u,LL v) {edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
void Dfs(LL u)
{
vis[u]=true;
for (LL i=head[u];i!=-;i=edge[i].next)
if (!vis[edge[i].to])
{
father[edge[i].to][]=u;
Dep[edge[i].to]=Dep[u]+;
Dfs(edge[i].to);
}
}
inline void Init()
{
for (LL j=;j<=;j++)
for (LL i=;i<=n;i++)
{
father[i][j]=father[father[i][j-]][j-];
for (LL k=;k>=;k--) if (f[i][j-].a[k])f[i][j].Insert(f[i][j-].a[k]);
for (LL k=;k>=;k--) if (f[father[i][j-]][j-].a[k])f[i][j].Insert(f[father[i][j-]][j-].a[k]);
}
}
void Solve(LL u,LL v)
{
if (Dep[u]<Dep[v]) Swap(u,v);
for (LL i=;i>=;i--)
if (Dep[father[u][i]]>=Dep[v])
{
for (LL k=;k>=;k--) if (f[u][i].a[k]) Ans.Insert(f[u][i].a[k]);
u=father[u][i];
}
if (u==v)
{
for (LL k=;k>=;k--) if (f[u][].a[k]) Ans.Insert(f[u][].a[k]);
return;
} for (LL i=;i>=;i--)
if (father[u][i]!=father[v][i])
{
for (LL k=;k>=;k--) if (f[u][i].a[k]) Ans.Insert(f[u][i].a[k]);
for (LL k=;k>=;k--) if (f[v][i].a[k]) Ans.Insert(f[v][i].a[k]);
u=father[u][i],v=father[v][i];
}
for (LL k=;k>=;k--) if (f[u][].a[k])Ans.Insert(f[u][].a[k]);
for (LL k=;k>=;k--) if (f[v][].a[k])Ans.Insert(f[v][].a[k]);
for (LL k=;k>=;k--) if (f[father[u][]][].a[k])Ans.Insert(f[father[u][]][].a[k]);
} int main()
{
Bin[]=; for (LL i=;i<=;i++) Bin[i]=Bin[i-]<<;
Get_Int(n),Get_Int(m);
for (LL i=;i<=n;i++)
{
Get_Int(x);
f[i][].Insert(x);
}
memset(head,-,sizeof(head));
for (LL i=;i<n;i++)
{
Get_Int(u),Get_Int(v);
Add(u,v),Add(v,u);
}
father[][]=; Dep[]=;
memset(vis,false,sizeof(vis)); Dfs();
Init();
for (LL i=;i<=m;i++)
{
Get_Int(u),Get_Int(v);
Ans.Clr();
Solve(u,v); Sum=;
for (LL j=;j>=;j--) Sum=Max(Sum,Sum^Ans.a[j]);
printf("%lld\n",Sum);
}
return ;
}

BZOJ4568

倍增合并线性基,贪心求最大值即可

Xor && 线性基练习的更多相关文章

  1. 【BZOJ-2115】Xor 线性基 + DFS

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status] ...

  2. BZOJ.2115.[WC2011]Xor(线性基)

    题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...

  3. BZOJ2115:[WC2011] Xor(线性基)

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  4. HDU3949 XOR (线性基)

    HDU3949 XOR Problem Description XOR is a kind of bit operator, we define that as follow: for two bin ...

  5. [hdu3949]XOR(线性基求xor第k小)

    题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ...

  6. HDU3949 XOR(线性基第k小)

    Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ...

  7. 2019牛客多校第一场H XOR 线性基模板

    H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...

  8. BZOJ 2115 [Wc2011] Xor ——线性基

    [题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...

  9. BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]

    2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...

随机推荐

  1. 基于jstree的 对混乱的 命名系统进行归类的 计算机软件

    本人现在就职于一家加拿大东部餐饮连锁公司的IT部门,公司旗下有4个品牌,280多家餐厅. 所有的餐厅都使用maitred 的pos软件来处理收银结账. 公司总部使用business object 对m ...

  2. BADI_MATERIAL_CHECK(物料主数据表的增强检查)

    多次调用的BADI,'业务加载项定义的多重使用意味着可以有多个活动的 业务加载项实施.在进行调用时,将调用所有上述实施,但调用顺序不可预期. 因此,如果使用多重使用 业务加载项定义,那么顺序不得起到任 ...

  3. 机器学习实战knn

    最近在学习这本书,按照书上的实例编写了knn.py的文件,使用canopy进行编辑,用shell交互时发现运行时报错: >>> kNN.classify0([0,0],group,l ...

  4. 初始通过 FastClick.notNeeded 方法判断是否需要做后续相关处理

    其实前面几篇文章大家都遇到一些错误,很多时候呢,我并没有直接回复解决方案,不是LZ不想告诉大家,如果不想那就不写这个了,估计博客园啊CSDN啊那么多写博客的,很少有人把现用框架分享出来,既然分享就毫不 ...

  5. 为什么.Net要求序列化的类必须有一个无参数的构造函数

    刚才用xml序列化器,序列化一个类,结果报错说序列化的类必须带有一个无参的构造函数,好奇怪啊.为什么要有这么苛刻的条件,而且xml序列化还要求序列化的成员是public. 我以前一直觉得序列化器是一个 ...

  6. MVC5+EF6 入门完整教程十一:细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  7. react native 页面跳转

    React Native目前有几个内置的导航器组件,一般来说我们首推Navigator.它使用纯JavaScript实现了一个导航栈,因此可以跨平台工作 场景简单来说其实就是一个全屏的React组件. ...

  8. background复合属性详解(上):background-image

    background复合属性是个很复杂的属性,花样非常多,比较神奇的是css3 中支持多图片背景了,这篇文章先讲讲background-image属性,其他背景属性会在后续的文章综合总结. 一.最基本 ...

  9. 小游戏Step表

    [Config]1|0|0|2|172,120,134|公主的记忆|1|2[Config] [Config]2|1|1|2|172,120,134|公主的记忆|1|2[Config] [Config] ...

  10. Cogs 14. [网络流24题] 搭配飞行员

    这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...