• [学习笔记]位运算


    计算机为什么用二进制?

    因为二进制简单。每个位置只有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)卡卡常即可。
  • 相关阅读:
    并查集
    CCF201604-02
    作业八
    作业七
    数据结构--链队列基本操作
    数据结构--栈的基本操作
    eclipse配置maven
    软件架构
    scala lambda 表达式 & spark RDD函数操作
    spark(3)
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9817561.html
Copyright © 2020-2023  润新知