学习C++从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:蓝桥杯备考冲刺必刷题(C++) | 汇总-CSDN博客
【题目描述】
欢迎来到异或王国,这是一个特殊的王国,对于一个数组它的价值并非所有数相加,而是所有数异或得到的值。
当然对于某些神奇的数组来说值可能是一样的,给定一个长度为
n
n
n的数组
a
a
a,请问有多少个子数组是神奇数组。
换句话说,在数组
a
a
a中存在多少对下标
l
l
l和
r
(
1
≤
l
≤
r
≤
n
)
r(1\le l\le r\le n)
r(1≤l≤r≤n)满足:
a
l
⊕
a
(
l
+
1
)
⊕
⋯
⊕
a
r
=
a
l
+
a
l
+
1
+
⋯
+
a
r
a_l\oplus a_(l+1)\oplus \dots \oplus a_r = a_l + a_{l+1} + \dots + a_r
al⊕a(l+1)⊕⋯⊕ar=al+al+1+⋯+ar
【输入】
第一行输入一个整数
n
n
n,表示数组
a
a
a的长度。
第二行输入
n
n
n个整数,表示数组
a
a
a的值。
【输出】
输出一个整数表示答案。
【输入样例】
5
1 2 3 4 5
【输出样例】
7
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n;
int a[200005];
int main()
{
cin >> n;
for (int i=1; i<=n; i++) { // 输入数组a
cin >> a[i];
}
int l = 1, r = 1, res = 0; // 定义左右指针以及前缀异或值
long long ans = 0; // 初始化满足对数
while (l<=n) { // 满足左指针的范围
while (r<=n && ((res^a[r])==(res+a[r]))) { // 满足右指针的范围,以及每个数的异或值等于每个数相加
res ^= a[r]; // 更新前缀异或值
r++; // 右指针移动
}
ans += r-l; // 计算下标对
res ^= a[l]; // 更新前缀异或值
l++; // 左指针移动
}
cout << ans << endl; // 输出结果
return 0;
}
【运行结果】
5
1 2 3 4 5
7