异或

建通道【思维异或lowbit最小生成树XOR_MST】【2020牛客寒假算法基础集训营2】

眉间皱痕 提交于 2020-02-07 04:30:19
也就是说,我们贪心的来想,肯定是先要让相同值的元素先建边,然后再是选择lowbit(x) == 1的,然后再是2的,再是4的以此类推,那么贪心的思维就出来了。 然后咋一看,是 的做法啊!怎么优化? 我们肯定是要0和1进行合并的,每一位的0、1进行合并,是为了贪心的考虑,所以说,我们从并查集的角度来看,不妨先是0中的第一个元素去合并完1中的所有元素,然后保留一个1中的元素,继续,把0后面的所有元素去看能不能和1中的这一个元素进行合并来是的复杂度变成 。 #include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #include <bitset> #include <unordered_map> #include <unordered_set> #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045

byte swap

我的梦境 提交于 2020-02-07 04:01:54
byte swap一个 32位数 0x12345678 --> 0x78563412 先是用了俩高低位mask 两两交换,不满意。 然后用了一个mask,每次取一个byte,移位异或ans。一共执行四次,还是不满意。 提示说用两步,能不能先交换 LSB 和 MSB,写了一下,但还是想不出怎么写。。。 正解: x = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16; x = (x & 0x00FF00FF) << 8 | (x & 0xFF00FF00) >> 8; 来源: https://www.cnblogs.com/beiyeqingteng/p/12271801.html

异或后最大lowerbit

China☆狼群 提交于 2020-02-07 01:51:07
https://ac.nowcoder.com/acm/contest/3003/I 题意:给n个地点,每个地点有一个值a,边值花费等于lowerbit(ai异或aj),要使n个地点联通,问最小花费。 解法:要使lowerbit最小考虑最小进制满足存在vi = 1 和 vj = 0 交叉连边 , 注意重复值为0直接去掉,去重后有num个. 答案为(1<<k)* (num-1) , 如果找不到这样的进制就说明点值全都一样,答案为0. #include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <string> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #define me(x , y) memset(x , y , sizeof(x)) #define SC scanf #define rep(i , j , n) for(int i = j ; i < n ; i ++) #define

dtoi4706 异或

早过忘川 提交于 2020-02-07 01:24:16
题意: 题解: 询问l~r的答案,很显然我们直接转化成0~r的答案减去0~(l-1)的答案。 如何求0~a的答案,从高位往低位枚举。 (1)如果当前位置在a中是1,那么这个位置可以取0,也可以取1。如果取0,那后面的随便取都无所谓,也就是说,后面的位置的0,1是可以随便乱放的,也就是说当前这一位为0^(x的这一位),然后之后位随便取,恰好是一个区间,可以求区间的答案。接下来把这一位取1^(x的这一位)然后继续往低位走。 (2)如果当前位置在a中是0,那么这个位置只能取0,就把这一位取0^(x的这一位),接着走。 接下来就是快速查询一段区间的答案,也就是一段区间的f(i)值。方法很多,可以二分直接做,然而我写了颗线段树维护。。。 #include<cstdio> #include<algorithm> #include<cstdlib> using namespace std; const int mod=998244353,INF=(1<<30)-1; int n,q,a[100002],cnt=1; typedef struct{ int ls,rs; long long sum,f; }P; P p[10000002]; void pushdown(int root,int begin,int mid,int end){ if (p[root].f) { if (!p[root

大容量数据安全传输系统设计与实现(具体)

a 夏天 提交于 2020-02-06 18:18:10
大容量数据安全传输系统设计与实现(具体) 一、需求 两个主体间实现远程大容量数据文件秘密传输(超过1G大小的容量) 1)设计并实现支持大容量数据秘密传输的系统; 2)该系统支持数据完整性和来源验证; 开发坏境需求:windows平台,语言平台不限。 二、原理 (1)hash函数 hash函数是将任意长度的输入变换成固定长度输出的函数,该输出称为散列值。MD5是一种被广泛使用的hash函数,可以产生出一个128位的散列值,主要用于确保信息传输完整一致。MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过一系列处理后,算法输出由四个32位分组组成的128位散列值。具体的步骤如下所示: 1、填充 如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余结果等于448,填充的方法是填充一个1和n个0。填充完成后,信息的长度为N* 512+448 2、记录信息长度 用64位内存来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N* 512 + 448 + 64 = (N+1)*512 3、装入标准的幻数 A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L。 4、循环运算 把消息分以512位为一分组进行处理;每一个分组进行4轮变换

找出数组中只出现一次的数字

冷暖自知 提交于 2020-02-05 23:08:49
题目 : 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解析 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。异或运算满足交换律结合律. 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位。我们就取第一个1所在的位数,假设是第3位,接着把原数组分成两组,分组标准是第3位是否为1。如此,相同的数肯定在一个组,因为相同数字所有位都相同,而不同的数,肯定不在一组。然后把这两个组按照最开始的思路,依次异或,剩余的两个结果就是这两个只出现一次的数字。 code //num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果    Java    c++ 来源: https://www.cnblogs.com/betterFamily/p/12266939.html

Python位运算符

佐手、 提交于 2020-02-05 12:19:56
Python位运算符:将 int 长整型数据看做二进制进行计算,主要是将前面的数和后面的数的对应位置上的数字 0,1 进行判断。      & 按位与:如果对应位置上的两个数都为 1,那么得到的该结果的该位置上也为 1 。其他情况都为 0。      | 按位或:如果对应位置上的两个数有一个为 1 或都为 1,则得到的该结果的该位置上也为 1 。其他情况都为 0。     ^ 按位异或:如果对应位置上的两个数为 0 和 1 或 1 和 0,则得到的该结果的该位置上也为 1 。其他情况都为 0。     ~ 按位取反:如果~后面为正数或 0,则结果为-(数+1),           如果后面的数为负数,则结果为-(负数(带符号)+1)。   << 左移运算符:将前面的数乘以 2 的(后面的数) 次幂。   >> 右移运算符:将前面的数除以 2 的(后面的数) 次幂。 #查看二进制 a = 2 b = 3 print(bin(a)) # 0b10 1*2的1次 + 0*2的0次 print(bin(b)) # 0b11 1*2的1次 + 1*2的0次 # & 按位与:如果对应位置上的两个数都为 1,那么得到的该结果的该位置上也为 1 。其他情况都为 0。 print(a & b) # 0b1 为与的结果 # | 按位或:如果对应位置上的两个数有一个为 1 或都为 1

伊吹萃香_(虫洞)

筅森魡賤 提交于 2020-02-05 12:02:00
• 阅读 网上竟然没有能看的懂的解释,我也是醉了 搞了好几个小时才找着一份代码,硬是看懂了 思路:记一个dis[i][j]数组,i表示节点,j表示时间是奇数还是偶数,0是偶数,1是奇数 某一个点的状态是由上一秒转移来的,而这两秒一定一个是奇数一个是偶数,所以1状态由0转移,0状态由1转移,黑洞需要翻转,而奇数秒的状态一定是被反转了的,偶数是没反转的,而这个可以用异或来搞定 因为0^1=1,1^1==0 而判断起点也是用异或 如果起点是白洞,偶数次之后还是白洞,奇数次后变成了黑洞,因为0^0=0,0^1=1,1^0=1,1^1=0 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 #include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cmath>using names 大专栏 伊吹萃香_(虫洞)pace std;struct st{ int s; bool f;};int n,m;int vis[19999][2]

CF923C Perfect Security

大兔子大兔子 提交于 2020-02-04 21:39:28
一、题目 点此看题 题目描述 给你两个长度为 n n n 的数组 a , b a,b a , b ,你可以把 b b b 数组任意排列后对应位和 a a a 数组异或,求字典序最小的异或结果。 二、解法 很容易看出的贪心,枚举 a a a 中的每一个值,找到和 b b b 未选中的值异或最小的结果,按顺序输出即可。 可以用一个数据结构维护 b b b 数组,异或相关问题我们可以使用 t r i e trie t r i e 树,我们把 b b b 数组拿去建 t r i e trie t r i e 树,然后把 a a a 中的每个值拿去匹配, t r i e trie t r i e 树上的每个点维护一个子树中还未被选中个数,就很容易做了。 注意把每一个值拆成长度为 30 30 3 0 的二进制串,从高位到低位做即可,时间复杂度 O ( n log ⁡ n ) O(n\log n) O ( n lo g n ) 。 # include <cstdio> # include <algorithm> using namespace std ; const int N = 300005 ; const int M = 30 * N ; int read ( ) { int x = 0 , flag = 1 ; char c ; while ( ( c = getchar ( ) ) <

Xor Path 树路径异或

可紊 提交于 2020-02-03 23:35:51
Xor Path 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 In graph theory, if an undirected gragh G(V, E) without cycle has n vertices, n − 1 edges and the graph is connected, then G(V, E) is called a tree. You are given a tree has n vertices, each vertice has a weight. Vertice i’s weight is wiw_iwi​ . Henry has q queries, each query has two vertices u, v. He wants to know the xor sum of the weights of all vertices on the shortest path from u to v (contains u,v). 输入描述: The first line is an integer n(1≤n≤105)n (1 ≤ n ≤ 10^5 )n(1≤n≤105), the number of the vertices