[学习笔记]位运算

计算机为什么用二进制?

因为二进制简单。每个位置只有0/1两种情况。

并且任何数都可以表示成二进制。

0/1代表开/关,选/不选都有优势。

例题:

1.

Single Number

■ 有一个数组,里面的元素每个都出现了两次,除了一个特殊的,求这个特殊元素。

直接异或

Single Number II

■ 还是一个数组,每个元素出现两次,只有两个特殊的元素出现一次,把这两个特
殊的元素找出来。

两个元素不同,至少一位不同。

所有的数异或起来得到a^b,任取为1的一位作为分解线,ab有一个这一位是1,另一个是0.然后把这一位是1的放一组,是0的放一组。

这样a,b一定分开了。然后分别异或可得。

2.BZOJ 4300 绝世好题

■ 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,
■ 满足bi&bi-1!=0(2<=i<=len)。

■ n<=100000,ai<=2*10^9

类似最长上升子序列统计。由于和前一位至少一位都有1,枚举是1的那一位,然后前缀max即可。

BZOJ 3687: 简单题

■ 小呆开始研究集合论了,他提出了关于一个数集四个问题:
1.子集的异或和的算术和。
2.子集的异或和的异或和。
3.子集的算术和的算术和。
4.子集的算术和的异或和。
目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决
定把这个问题交给你,未来的集训队队员来实现。
■ ai >0,1 < n < 1000,∑ai≤2000000。

之间算不好算。发现,异或满足交换律,所以,如果一个算数和出现了2次,那么贡献就是0了。

所以,bitset<2000000>f,计算算数和为f[i]的次数的奇偶性。

对于x,f^=(f<<x)即可。初始f[0]=1;

其实就是bitset优化背包。。。。

bzoj 4713: 迷失的字符串

 

有一棵n个节点的大树,上面每条边有一个小写字符。
对于任意两个不同的点u,v,我们可以在树上找到u出发到v终止的唯一的一条最短路径,并将沿途经过的边上的字符依次写下来,得到一个字符串。
对于一个字符串,如果存在这样一个点对(u,v),使得它们路径上的字符串与其完全匹配,那么我们就称这个字符串属于这棵树。
现在有m个迷失的字符串,请你写一个程序帮助判断每一条字符串是否属于这棵树。
 
n<=30000
输入数据保证所有迷之的字符串的长度之和不超过30000。
 
题解:
树形dp。f[i][j]表示,以i为根子树,从前到后匹配到第j位是否可行。
f[x][j]|=g[y][j-1]&(c[i]==s[j])
f[x]|=g[y]&t[c[i]],
t[c][j]=1表示,s[j]=c
然后,再处理一个g[i][j]倒着来。
如果存在一个点,f[i][j]=g[i][j]=1,那么存在。
O(nm/32)卡卡常即可。
原文地址:https://www.cnblogs.com/Miracevin/p/9817561.html