[学习笔记]位运算

计算机为什么用二进制?

因为二进制简单。每个位置只有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值