异或和运算
1.异或运算的规则:
0⊕0=0:两个0进行异或运算结果为0。
1⊕0=1:第一个数为1,第二个数为0进行异或运算结果为1。
0⊕1=1:第一个数为0,第二个数为1进行异或运算结果为1。
1⊕1=0:两个1进行异或运算结果为0。
我们一般把x异或y记为x xor y。
2.异或运算具有一些有用的性质,这些性质在编程中经常被利用。下面是异或运算的一些主要性质:
1.交换律:对于任意两个值 a 和 b,都有 a ^ b == b ^ a。即异或运算满足交换律。
2.结合律:对于任意三个值 a、b 和 c,都有 (a ^ b) ^ c == a ^ (b ^ c)。即异或运算满足结合律。
3.自反性:对于任意值 a,都有 a ^ a == 0。即一个值与自己进行异或运算结果为0。
4.零值:对于任意值 a,都有 a ^ 0 == a。即一个值与0进行异或运算结果为其本身。
5.恒等元:零值0是异或运算的恒等元,即 a ^ 0 == a,这与加法中的零元素的性质类似。
6.相同值的异或结果为0:对于任意值 a,都有 a ^ a == 0,这意味着相同的两个数进行异或运算结果为0。
7.异或运算满足分配律:对于任意三个值 a、b 和 c,有 (a ^ b) ^ c == (a ^ c) ^ (b ^ c)。即异或运算满足分配律。
这些性质使得异或运算在编程中具有广泛的应用,包括数据加密、校验、交换变量值、去重等方面。
3.什么是异或和
类似于把序列中的所有数加起来叫加和,我们也可以定义异或和,例如序列a1, a2, a3的异或和为
(a1 xor a2)xor a3。
4.异或前缀和
参考普通前缀和,定义一个前缀和数组为 s[n],令 s[i] = s[i-1]^a[i],则对于一个区间 [l,r]的异或和为 s[r]^s[l-1]。主要利用了 a ^ a = 0的这一性质。
通过异或前缀和,我们可以快速求出某一区间的异或和。
题目:
异或和之和
https://www.acwing.com/problem/content/description/5004/
分析:
具体来说,按照给的参考例子,数组1 2 3 4 5,对应的s数组为0 1 3 0 4 1(s[0] ~ s[5])
s[0] = 0 = 0 0 0 0, s[1] = 1 = 0 0 0 1, s[2] = 3 = 0 0 1 1, s[3] = 0 = 0 0 0 0, s[4] = 4 = 0 1 0 0, s[5] = 1 = 0 0 0 1
显然只用考虑二进制的前3位,第1位为0 1 1 0 0 1,从第一个元素开始,1之前只有s[0]为0,所以贡献为1,第二个1前有0 和 1,0的数量为1,贡献为1 + 1 = 2,第三个0前面有两个1,贡献为2 + 2 x 1 = 4,第四个0同样,贡献为4 + 2 x 1 = 6,最后的1前面有3个0,所以二进制第一位的总贡献为6 + 3 * 1 = 9。同理,二进制第二位,第三位的贡献为10 和 20,这样算出来区间和为39
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
const int N = 100010;
typedef long long LL;
int a[N],s[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ){cin>> a[i];}
for (int i = 1; i <= n; i ++ ){s[i]=s[i-1]^a[i];}
LL ans=0;
for (int j = 0; j < 21; j ++ ) //枚举每一位,给的Ai范围是0 ~ 2^20
{
int c0 = 1, c1 = 0; //s[0]始终为0,所以多一个c0 = 1
LL now = 0; //当前位的答案
for (int i = 1; i <= n; i ++ )
if (s[i] >> j & 1) now += c0, c1 ++ ; //s[i]的第j位是1
else now += c1, c0 ++ ; //s[i]的第j位是0
ans += now * (1 << j);
}
cout << ans <<endl;
}
拓展:连续子序列(未作)
https://www.acwing.com/problem/content/description/5729/
本文来自博客园,作者:{yisone},转载请注明原文链接:https://www.cnblogs.com/yisone/p/18269320
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型