• 异或结论


    ~~~

    S+{ X+(X+S) }=2(X+S)

    X^{ X^(X+S) }=X+S

    cf 628D

    题意:
    给定一个u代表一个数组的全部异或给定一个u代表一个数组的全部异或
    给定一个u代表一个数组的全部异或

    给定一个v代表一个数组的全部和给定一个v代表一个数组的全部和
    给定一个v代表一个数组的全部和

    问你这个数组最短的长度及其每个元素问你这个数组最短的长度及其每个元素
    问你这个数组最短的长度及其每个元素

    题解:

    对于二进制a+ba+ba+b的某一位来说
    a xor ba ~xor~ba xor b可以表示a+ba+ba+b的本位,aaa&bbb可以表示a+ba+ba+b的进位
    然后将aaa&bbb左移一位就可以表示a+ba+ba+b
    所以可以得到
    a+b=a xor b+2∗a&ba+b=a~xor~b+2*a&b
    a+b=a xor b+2∗a&b

    所以通过本题可以推出
    v=u+2∗a&bv=u+2*a&b
    v=u+2∗a&b

    所以可以知道如果u>vu>vu>v或者(u−v)%2=1(u-v)\%2=1(u−v)%2=1这样是恒不成立的
    然后特判一下u=vu=vu=v的情况
    if(u=v=0)数组是空的if (u=v=0)数组是空的
    if(u=v=0)数组是空的

    else数组里只有一个元素uelse 数组里只有一个元素u
    else数组里只有一个元素u

    其他情况下数组肯定至少有两个元素
    然后通过刚才的公式计算出a&ba&ba&b,循环判断a&ba&ba&b和a xor ba~xor~ba xor b的每一个二进制位
    如果a&ba&ba&b在该位是111,说明该位每个数都为111,所以用cnt[i]+=2cnt[i]+=2cnt[i]+=2
    如果a xor ba~xor~ba xor b在该位是111,说明该位有奇数个111,所以需要cnt[i]+=1cnt[i]+=1cnt[i]+=1
    这样cntcntcnt数组的最大数就代表数组的长度
    最后循环每次取出一个作为其中一个数二进制位的第i位
    首先令x=a&b=(v−u)/2x=a&b=(v-u)/2x=a&b=(v−u)/2
    如果长度为333的情况就是出现过两个都为111的时候(((即u&x!=0即u&x!=0即u&x!=0)))
    长度为333的时候,其实每个二进制位x=1x=1x=1的时候都在这位加了两次,所以数组中会出现两个xxx,由于每次在某二进制位u=1u=1u=1的时候该位都会加111,所以数组中可以分离出一个uuu
    最终可以确定此时数组的元素为[u,x,x][u,x,x][u,x,x]

    如果长度为222的情况就是没出现过两个都为111的时候(((即u&x==0即u&x==0即u&x==0)))
    此时可以发现数组依旧可以分离出两个xxx,一个uuu,但是此时的数组长度为2,不能全部直接放到数组里。但是此时u&x==0u&x==0u&x==0,说明如果u+x xu+x~xu+x x为1的二进制位u都为0,所以再用一个xxx二者异或就会重新得到u
    2

  • 相关阅读:
    Android之TabHost使用(引用SDK例子文档)
    Android之在线词典
    校验插入指定结点是否导致编码循环的示例函数
    查表法按日期生成流水号的示例.sql
    备份数据库并提供下载的asp文件
    Metro风格XAML应用程序性能技巧
    导入文本文件时如何指定字段类型.sql
    宝塔形数据的处理.sql
    将某个目录上的Excel表,导入到数据库中.sql
    Using SqlDataReader’s new async methods in .Net 4.5 Beta
  • 原文地址:https://www.cnblogs.com/poo7/p/12128575.html
Copyright © 2020-2023  润新知