我觉得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. C# 学习之旅(1)

    第一, 输入输出流都来自控制台. using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  2. 用minicom 产看 usb的串口

    1 用命令   sudo apt-get install minicom  安装 2 用 minicom -s 进行配置 往下选择  Seral port setup: 然后输入  A :选择自己的 ...

  3. WPF-实现Windows 7 样式 Aero TreeView 控件

    关于实现Windows 7 样式 Aero TreeView 控件的具体过程可以参考如下文章 http://www.cnblogs.com/o2ds/archive/2010/06/22/176302 ...

  4. C#...何时需要重写ToString()方法?

    一般类型,都是继承自System.Object类,默认情况下,object类的ToString方法会返回当前类的类型的字符串表达形式.但也有例外!! DateTime,它就重写ToString方法,D ...

  5. C# 将datatable 转换json

    public static string DataTableToJson(DataTable dt) { StringBuilder jsonBuilder = new StringBuilder() ...

  6. Web Api 控制器

    Web Api 控制器 文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简 ...

  7. 元素属性和js数组

    arrObj.push(数组元素) --增加arrObj.splice(index,howmany)--删除  一般howmany为1,  index,开始截取掉的位置,arrObj[index].P ...

  8. Linux中的MyEclipse配置Hadoop

    一.所需软件 注意:安装MyEclipse后,我再已安装软件里找不到MyEclipse,所以我在root权限下用命令行启动MyEclipse,貌似避免了很多权限问题. sudo su 输入密码 cd ...

  9. jmp && call && ret 特权级转移 & 进程调度

    ①jmp是不负责任的调度,不保存任何信息,不考虑会回头.跳过去就什么也不管了.②call,保存eip等,以便程序重新跳回.ret是call的逆过程,是回头的过程.这都是cpu固有指令,因此要保存的信息 ...

  10. <span> <div> 局部 keydown ,keyup事件。页面部分div $(document) 无效,可能焦点,添加焦点。

    前天改一个bug, js 实现的一个 面板拖拉,左右各两个列表,中间面板画线连接,页面左侧列表选中后,key 事件无效.右侧选中确有效,很奇怪,查看源码,左侧选中后,$(document).on(&q ...