我觉得xor这东西特别神奇,最神奇的就是这个性质了 A xor B xor B=A

这样就根本不用在意重复之类的问题了

关于xor的问题大家可以去膜拜莫队的《高斯消元解XOR方程组》,里面写的很详细

我来扯两道bzoj上的例题好了

bzoj2115,求1-N最长xor路径,根据那个神奇的性质,我们先随便找一条1-n的路径作为标准路径

任意一条1-N的路径都等价于标准路径和某些环的xor

怎么找环?很简单,bfs下去,设d[x]表示1到x的一条路径xor值,如果到一条边x-->y时y已经访问过了,那么d[x] xor d[y] xor w[x,y]就是一个环

然后这个问题就转变成了求一堆数中任意数xor最大的问题,这我们是通过求线性基然后按位贪心就可以了

 type node=record
po,next:longint;
num:int64;
end; var f:array[..] of int64;
d:array[..] of int64;
q,p:array[..] of int64;
a:array[..] of int64;
e:array[..] of node;
x,y,i,n,m,len,t:longint;
ans,z:int64; procedure add(x,y:longint;z:int64);
begin
inc(len);
e[len].po:=y;
e[len].num:=z;
e[len].next:=p[x];
p[x]:=len;
end; procedure bfs;
var h,r,i,x,y:longint;
begin
fillchar(d,sizeof(d),);
d[]:=;
h:=; r:=; q[]:=;
while h<=r do
begin
x:=q[h];
i:=p[x];
while i<> do
begin
y:=e[i].po;
if d[y]=- then
begin
d[y]:=d[x] xor e[i].num;
inc(r);
q[r]:=y;
end
else if d[y] xor d[x] xor e[i].num<> then //找环
begin
inc(t);
a[t]:=d[y] xor d[x] xor e[i].num;
end;
i:=e[i].next;
end;
inc(h);
end;
end; procedure gauss;
var i,j:longint;
begin
for i:= to t do
for j:= downto do
if a[i] and (int64() shl j)> then //求线性基
begin
if f[j]= then
begin
f[j]:=a[i];
break;
end
else a[i]:=a[i] xor f[j];
end; ans:=d[n];
for i:= downto do
if ans and (int64() shl i)= then ans:=ans xor f[i];
end; begin
readln(n,m);
for i:= to m do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
bfs;
gauss;
writeln(ans);
end.

bzoj2844

一堆数xor能产生数的种类数就是2^线性基的秩

并且每个数出现的次数是一样的(求证明)

然后我们就可以做了,注意这里的线性基要用高斯消元求而不能用上题的方法

因为要计算某个数出现在第几位,必须使线性基相互xor的数的大小满足二进制位的大小关系

举个例子,比如线性基a,b,c并且a>b>c,如果取a,b xor,选取状况为110,这样选取xor的数一定要比011这样选大,我们称之为满足二进制大小关系(我自己口胡的名词)

 const mo=;

 var a,d:array[..] of longint;
f,b:array[..] of longint;
k,p,i,j,n,ans,m,t:longint; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; begin
readln(n);
for i:= to n do
read(a[i]);
d[]:=;
for i:= to n do
d[i]:=d[i-]* mod mo; readln(m);
k:=n;
for i:= to n do
begin
for j:=i+ to n do
if a[i]<a[j] then swap(a[i],a[j]);
if a[i]= then
begin
k:=i-;
break;
end;
for j:= downto do
if a[i] and ( shl j)> then
begin
b[i]:=j;
for p:= to n do
if (p<>i) and (a[p] and ( shl j)>) then
a[p]:=a[p] xor a[i];
break;
end;
end;
ans:=;
for i:= to k do
if m and ( shl b[i])> then
begin
m:=m xor a[i];
ans:=(ans+d[k-i+n-k]) mod mo;
end; writeln(ans);
end.

关于高斯消元解决xor问题的总结的更多相关文章

  1. 【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫

    [题目大意] 有n个数或为奇数或为偶数,现在进行m次操作,每次取出部分求和,告诉你这几次操作选取的数和它们和的奇偶性.如果通过这m次操作能得到所有数的奇偶性,则输出进行到第n次时即可求出答案:否则输出 ...

  2. 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树

    [题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...

  3. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

    http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...

  4. Light OJ 1272 Maximum Subset Sum 高斯消元 最大XOR值

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011686226/article/details/32337735 题目来源:problem=12 ...

  5. HDU 4418 高斯消元解决概率期望

    题目大意: 一个人在n长的路径上走到底再往回,走i步停下来的概率为Pi , 求从起点开始到自己所希望的终点所走步数的数学期望 因为每个位置都跟后m个位置的数学期望有关 E[i] = sigma((E[ ...

  6. 高斯消元与xor方程组

    ;i<=n;i++) { ;j<=n;j++) if(a[j]>a[i]) swap(a[i],a[j]); if(!a[i]) break; ;j>=;j--) ) { ;k ...

  7. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  8. BZOJ 3143 HNOI2013 游走 高斯消元 期望

    这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...

  9. BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )

    高斯消元解xor方程组...暴搜自由元+最优性剪枝 -------------------------------------------------------------------------- ...

随机推荐

  1. PHP 归并排序

    在我们日常的程序开发时候,有时候需要对一个已知的集合按照一定的规则进行排序,其实当数据的规模不太大时或者数据的有序特征比较明显,其实我们可以采用其它的排序算法例如:Bubble Sort, Inser ...

  2. MYSQL 多表更新 UPDATE SET like concat('%',abc,'%');

    SQL语句为:select * from table1 where `text` like CONCAT('%',(select name from table2 where id =3),'%'); ...

  3. Delphi中的四舍五入函数

    一.Delphi中的四舍五入法     四舍五入是一种应用非常广泛的近似计算方法,针对不同的应用需求,其有算术舍入法和银行家舍入法两种.     所谓算术舍入法,就是我们通常意义上的四舍五入法.其规则 ...

  4. Python字符串内建处理函数

    #coding=utf-8 __author__ = 'Administrator' # 字符串处理函数 s1 = "study python string function , I lov ...

  5. Windows Service 访问远程共享权限设置

    最近为实现共享目录之间的文件同步,开发了一个Windows Service. 考虑到在拷贝过程中,如果网络忽然抽风访问不了,导致文件拷贝不完整的情况,果断抛弃.Net 自带的 COPY 方法,而使用D ...

  6. linux set,env和export

    set,env和export这三个命令都可以用来显示shell变量 set 显示当前shell的变量,包括当前用户的变量 env 显示当前用户的变量 export 显示当前导出成用户变量的shell变 ...

  7. MySQL的复制原理及配置

    MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题. 一.复制的原理 MySQL 复制基于主服 ...

  8. oracle闪回表详解

    --- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...

  9. 第一章 基本的SQL语句 (SQL基础)

    1. 查询数据库系统时间,常以服务器默认的格式进行显示(根据数据库的字符集而定): 注意:dual 为数据库中的虚表,隶属于管理员 sys 用户,但所有的用户都可以访问:无实际意义,仅充当select ...

  10. C#时间戳与时间互转

    /// <summary> /// 时间戳转成时间类型 /// </summary> /// <param name="timeStamp">& ...