我觉得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. html5 的<audio> 音频 audio的“坑”

    <audio>标签是html5的一个非常有意义的特性.告别的flash的时代.它的属性有: autoplay:音频就绪后马上播放 controls:出现该属性,向用户显示播放的控件. lo ...

  2. git命令行

    cmd下运行或者 进入git bash运行 输入 exit退出切换到仓库目录后再git statusgit commit -m 注释 git pull origin1 mastergit push o ...

  3. PySide 简易教程<一>-------Hello PySide

    PySide 是一个python绑定的跨平台GUI Qt库.目前,支持Python的Qt库有两个PyQt和PySide.PySide是一个免费的软件,与PyQt不同之处在于使用了LGPL,允许PySi ...

  4. sublime text2 中文乱码的解决办法

    1.安装Sublime Package Control 在Sublime Text 2上用Ctrl+-打开控制台并在里面输入以下代码,Sublime Text 2就会自动安装Package Contr ...

  5. ThinkPHP I方法

    ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话,可以直接参考使用3.1快速入门教程系列的变量部分. 概述 正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新 ...

  6. php5函数库

    * APC缓存 apc_add — 缓存一个变量到数据存储 * DateTime DateTime::addDateTime::diffDateTime::formatDateTime::modify ...

  7. shell调用sqlplus批量执行sql文件

    在最近的工作中,经常需要批量执行一些DML, DDL, PL/SQL语句或导入一些Function, Procedure.因为support的国家比较多,常常需要一个登陆到一个国家的数据库上执行完成后 ...

  8. .vimrc & .bashrc 文件配置

    /* 如果vim还没有语法高亮,那么在/etc/profile 中添加以下语句 */ export TERM=xterm-color // 注: 只对各个用户自己的主目录下的.vimrc修改的话,修改 ...

  9. python学习笔记7(使用字符串)

    一.字符串格式化,在%左侧放置一个字符串,右侧放置希望格式化的值. >>> format = 'Hello,%s,%s enough for ya?' >>> va ...

  10. DB天气app冲刺第十天

    好了 这是第十天了,按照白板任务上的来说的话,今天没有完成,所以等一下还要继续看看今天能不能把他做完,今天出的问题在于我又自己调整了一下UI设计,因为发现以前的设计发面有重复,浪费了屏幕.所以还不如省 ...