异或

BZOJ5495 [2019省队联测]异或粽子

北城余情 提交于 2020-02-12 14:33:09
题意: 给定一个序列,问最大的k段连续异或和的代数和。 知识点: 可持久化Trie,堆 解法: 首先异或的一个性质可以把连续子串转化成前缀和的形式维护。 然后看到异或代数和最大,可以想到可持久化Trie。 但是维护的方法又有两种。 第一种也是我一开始想到的,把n个值最大的放到堆中,每次从堆中取出一个元素,更新答案;然后找出这个元素唯一对应的下一个值(暴力跳trie,最多不超过64次)。但是太难了。 第二种就是超级钢琴的做法,在l到r中找到最大的答案为pos点,然后放入l到pos-1和pos-1到r继续更新答案即可。 备注: 这种超级钢琴的做法很值得学习。注意这道题堆里面要维护的是l,r,pos,val,id,id不可以省。 代码: #include<cstdio> #include<cstring> #include<queue> using namespace std; typedef long long ll; const int maxn=500010; int n,m,tot,bit[35],rt[maxn]; ll ans,sum[maxn]; struct trie { int ch[2],tag,id; }a[maxn*40]; struct data { int l,r; ll val; int pos,id; bool operator <(const data

计数区间异或为0(可交)

こ雲淡風輕ζ 提交于 2020-02-12 01:44:00
https://ac.nowcoder.com/acm/contest/3005/D 题意:给出一组数n,问有多少区间异或和为0. 解法:如果[l,r]是合法的子段,说明前缀和中xorsum[r]^xorsum[l-1] = 0, xorsum[l-1] = xorsum[r]。 求出异或前缀和,然后使用map计数每一个数字有多少个前缀和等于那个数字即可。 #include <bits/stdc++.h> #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 red(i , n , j) for(int i = n-1 ; i >= j ; i--) #define INF 0x3f3f3f3f #define mod 998244353 #define PI acos(-1) #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 using namespace std; typedef long long ll ; const int maxn = 2e5+9; int a[maxn]; int pre[maxn]; int main

计数区间异或为0(不可交)

吃可爱长大的小学妹 提交于 2020-02-12 01:34:04
https://www.cnblogs.com/Harley-Quinn/p/7513052.html 题意:给一组数n,求区间异或和为0且任意区间不交的数量 解法:贪心两区间都为0选右边界小的区间,会使得答案更优 #include <iostream> #include <vector> #include <algorithm> using namespace std; int a[100009]; int cnt = 0 ; void work(int a[] , int n){ vector<int>v; v.reserve(n); int low = 0 ;//左边界 for(int i = 0 ; i < n ; i++)//右边界 { v.clear(); v.push_back(a[i]); for(int j = i-1 ; j >= low ; j--) { v.push_back(v.back()^a[j]);//以i为右边界low为左边的所有区间异或和存入数组v } if(find(v.begin() , v.end() , 0) != v.end())//查找区间异或为0 { low = i+1 ;//更新左边界。 cnt++; } } } int main() { int n; scanf("%d" , &n); for(int i = 0 ; i < n

BZOJ 3261 最大异或和

可紊 提交于 2020-02-10 20:50:00
https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目 给定一个非负整数序列{a},初始长度为N。 有M个操作,有以下两种操作类型: 1、A x:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。 2、Q l r x:询问操作,你需要找到一个位置p,满足l<=p<=r,使得: a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。 假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。 Constrain N,M<=300000,0<=a[i]<=10^7。 题解 可持久化trie! 类似于xor longest path,但是加入了时间限制 $a[p] \mathrm{xor} a[p+1] \mathrm{xor} \cdots \mathrm{xor} a[N] \mathrm{xor} x=a[N] \mathrm{xor} a[p-1] \mathrm{xor} x = a[N] \mathrm{xor} x \mathrm{xor} a[p-1]$ 那么就只考虑时间限制 可以把trie树复制几次,但是空间不够用 只考虑指针,复制变成指向之前的版本,添加的节点新建就可以了,还要注意添加的节点也有复制之前的版本的部分。 这样就可以得到时间$

php异或计算绕过preg_match()

僤鯓⒐⒋嵵緔 提交于 2020-02-10 09:10:51
原理 以制作免杀马为例: 在制作免杀马的过程,根据php的语言特性对字符进行!运算会将字符类型转为bool类型,而bool类型遇到运算符号时,true会自动转为数字1,false会自动转为数字0,如果将bool类型进行计算,并使用chr()函数转为字符,使用"."进行连接,便可以绕过preg_match匹配。 详情了解php不同于其他语言部分 但是很多的preg_match会过滤掉".",所以需要使用异或运算进行绕过,很多的免杀马都是这样制作的。php对字符进行异或运算是先将字符转换成ASCII码然后进行异或运算,并且php能直接对一串字符串进行异或运算,例如"123"^"abc"是"1"与"a"进行异或然后"2"与"b"进行异或,以此类推,在异或结束后就获得了想要的字符串。 注意点:进行异或运算时要将数字转换成字符形式,如果数字(int)和字符异或的话,结果只会是数字,例如1^"a"=1,"a"^2=2,将数字转换成字符串可以使用trim()函数。 拓展: php特性use of undefined constant,会将没有引号的字符都自动视为字符串,ASCII码大于0x7F的都会被当作字符串,由此可知可以简化异或过程,任何字符与0xff异或都会取相反,这样就能减少运算量了。 以GET或POST传入字符绕preg_match为例: php的eval()函数在执行时如果内部有类似

线性基

时光怂恿深爱的人放手 提交于 2020-02-10 05:35:05
简单来说一些数的线性基就是一组数据 \((q_1,q_2,q_3...)\) 使得这些数的任意一个子集的异或和可以由这组数据表示,其中 \(q_x\) 的最高位是x [cqoi2013]新Nim游戏 普通Nim游戏的必胜条件是异或和不为0 这道题就是要我们先拿走一些使得第二个游戏者无论拿什么都不能使得剩余部分异或和为0,也就是说对于后者面对的集合没有一非空子集个的异或和是0 这就代表着所剩集合线性不相关!(即没有一个子集能用另一个子集表示 也就是说我们从大到小的往线性基里加元素,加不进去的就统计进答案 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define M 100001 using namespace std; int n,m,k,a[M],d[M]; long long ans; bool add(int x) { for(int i=31;i>=0;i--) { if(!(x>>i)) continue; if(!d[i]) {d[i]=x; return 1;} x^=d[i]; } return 0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a

深入浅出计算机组成原理学习笔记: 第十三讲

六月ゝ 毕业季﹏ 提交于 2020-02-09 08:25:33
一、上节回顾 上一讲,我们看到了如何通过电路,在计算机硬件层面设计最基本的单元,门电脑,我给你看的门电路非常简单,只能做简单的“与(AND)”“或(OR)”“NOT(非)”和“异或(XOR)”, 这样最基本的单比特逻辑运算。下面这些门电路的标你需要非常熟悉,后续的电路都是由这些门电路组合起来的。 这些基本的门电路,是我们计算机硬件端的最基本的“积木”,就好像了高积木里面最简答的小方块,看似不起眼但把他们组合起来满最终可以搭出一个星际大战里面千年年隼这样的大玩意儿。 我们今天包含十亿级别晶体管的现代 CPU,都是由这样一个一个的门电路组合而成的。 二、异或们和半加器 1、2个8位整数的加法 1、2排8个开关加法得到结果 2、需要1排8位的开关 2、其实加法器就是像一个办法把三排开关电路连起来 3、我们人在计算加法的时候一般会怎么操作 4、为什么我们需要异或? 其实异或就是一个最简单的整数加法,所需要使用的基本电路 5、进位 那这个就对应一个与门,也就是有且只有在加数和被加数都是1的时候,我们的进位才是1 6、半加器 所以、通过一个异或们计算机出个位,通过一个与或门计算出是否仅为,我们就通过电脑算出了一位数的加法、 于是、我们把两个门电路打包,给它取一个名字,就叫做半加器 7、半加器的电路演示 三、全加器 1、半加器存在的问题 1、解决了什么问题? 2、存在什么问题? 2

ACM线性基学习笔记

故事扮演 提交于 2020-02-08 05:51:15
https://www.cnblogs.com/31415926535x/p/11260897.html 概述 最近的几场多校出现了好几次线性基的题目,,会想起之前在尝试西安区域赛的一道区间异或和最大的问题时,当时因为异或的性质知道这道题肯定用线段树来维护区间的最值,但是不知道用什么来处理异或和最大,,即使后来知道了可以用线性基来处理,看了一些博客也因为感觉太难收藏到书签就再也没看过,,,于是这几天,花了差不多4、5天的时间,大概看懂了这部分的内容,感觉这只是一种专门处理异或问题的一个工具,光这个工具没什么意思,,现在的很多题目都是用线性基套各种东西,,比如说很常见的线段树(大多都是询问)、树链剖分(也就是树上路径的异或问题,主要是求LCA来维护)、简单图以及像杭电第一场的那题一样贪心魔改线性基板子等等,,不可能单纯的只是用线性基板子来求一个什么最值,K值,并交等等性质,下面是我这几天学习线性基的简单的一个学习过程的记录。 数学知识 关于线性基,虽然看起来这三个字很高深,,但是等大致了解之后,就会发现,这只是一个简单的数学工具,基础知识就是学过的线性代数 (虽然早就忘记了) 。 抛开线性代数,我个人的理解就是 线性基就是一个用来表示给定集合的一个最少的数的集合, 用线性基这个集合,可以表示它所 张成 的一个集合,对于我们遇到的大多数题目来说,就是用一个最少的数的集合 \(lb\)

[CSU1216]异或最大值

落爺英雄遲暮 提交于 2020-02-07 18:29:00
最大异或和 题解 把二进制数放在树上,然后枚举每个数,根据贪心的思路在trie树上尽量往反方向就好了 单纯的为了写一下trie #include<bits/stdc++.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) typedef long long LL; typedef pair<int,int> PII; #define X first #define Y second const int maxn=100010; int n,a[maxn],ch[32*maxn][2],val[32*maxn],sz,ans; void insert(int x) { int now=0; for(int i=31;i>=0;i--) { int c=(x>>i)&1; if(!ch[now][c])ch[now][c]=++sz; now=ch[now][c]; } val[now]=1; } int search(int x) { int res=0,now=0; for(int i=31;i>=0;i--) { int c=(x>>i)&1; if(ch[now][c^1])c^=1; res|=(c<<i); now=ch[now][c]; } return res; } int main() {

异或的性质及应用

强颜欢笑 提交于 2020-02-07 10:44:10
异或性质 [1]: 交换律:A ^ B = B ^ A; 结合律:A ^ (B ^ C) = (A ^ B) ^ C; 恒等律:X ^ 0 = X; 归零律:X ^ X = 0; 自反:A ^ B ^ B = A ^ 0 = A; 对于任意的 X: X ^ (-1) = ~X; 如果 A ^ B = C 成立,那么 A ^ B = C,B ^ C = A; 三次异或可以交换两个数 [2]: a和b是两个整数,经过以下三次异或操作,可以达到交换目的: a = a ^ b; b = a ^ b; a = a ^ b; 则a与b完成交换。 Reference : [1]: https://blog.csdn.net/Jasmineaha/article/details/81412711 [2]: https://www.cnblogs.com/bsc2012/p/9260436.html 来源: https://www.cnblogs.com/dysjtu1995/p/12271967.html