异或和运算

异或和运算

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

#include

#include

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 <

}

拓展:连续子序列(未作)

https://www.acwing.com/problem/content/description/5729/

相关推荐

Linux:线程优先级设置
彩票365官网下载安装

Linux:线程优先级设置

📅 09-28 👁️ 629
小狗的毛长出来需要多久?(了解小狗毛发生长周期,打造健康宠物)
rm格式文件怎么打开
彩票365官网下载安装

rm格式文件怎么打开

📅 08-16 👁️ 9742