异或方程组 线性基

jys posted @ Feb 03, 2014 09:18:20 PM in 未分类 , 2513 阅读

线性基linear base

for(int i=1;i<=n;i++)
for(int j=64;j>=1;j--)
{
	if(a[i]>>(j-1)&1)
	{
		if(!lb[j]){lb[j]=a[i];break;}
		else a[i]^=lb[j];
	}
}

用这个算法可以求出a数组的线性基

线性基 就是原数组所能xor出的一切数这个线性基都能xor出来,不多不少

正确性显然

见莫涛PPT例六解法三

线性基的个数不超过log2V个,且对于每一位i,有且仅有一个线性基在这一位上是1(见构造过程)

注意到这个算法是在线的,可以随时插入一个新数

如果要支持在线的增加一个数/删除一个数/查询当前所有数的线性基 二进制分组(sillycross的数据结构pdf)或者线段树可以做到一次操作O(64*lgn)

------------与XOR本身关系并不大的东西

一个无向图上的一条路径(u---...---v)的xor和,总可以被u到v的任意一条路径xor一些环的xor值得到

------------------------------------

有了这些东西之后基本上就能做题了

http://www.lydsy.com/JudgeOnline/problem.php?id=2322

http://www.lydsy.com/JudgeOnline/problem.php?id=2115

http://poj.openjudge.cn/challenge4/D/

-----------------------------------

是看到最后一道题 才突然发现自己这一块完全不懂的


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter