Xor Sum 2二分/尺取 区间异或和等于区间和的方案数
题目描述
There is an integer sequence A of length N.
Find the number of the pairs of integers l and r (1≤l≤r≤N) that satisfy the following condition:
Al xor Al+1 xor … xor Ar=Al + Al+1 + … + Ar
Here, xor denotes the bitwise exclusive OR.
Definition of XOR
Constraints
1≤N≤2×105
0≤Ai<220
All values in input are integers.
输入
Input is given from Standard Input in the following format:
N
A1 A2 … AN
输出
Print the number of the pairs of integers l and r (1≤l≤r≤N) that satisfy the condition.
样例输入 Copy
4
2 5 4 6
样例输出 Copy
5
提示
(l,r)=(1,1),(2,2),(3,3),(4,4) clearly satisfy the condition. (l,r)=(1,2) also satisfies the condition, since A1 xor A2=A1 + A2=7. There are no other pairs that satisfy the condition, so the answer is 5.
求出有多少个区间(l,r) 满足区间的异或和等于区间和
区间异或和 与 区间和 在处理完前缀之后,会满足:
a[l] + a[l+1] + .... == sum[r] - sum[l-1]
a[l] ^ a[l+1] ^ ... == xorSum[r] ^ xorSum[l-1]
对于一个左端点l和右端点r,如果说l->r之间满足区间异或和等于区间和,那么说从l -> r-1也是满足的,所以说此时对答案的贡献便是区间的长度r - l + 1,我们只需要找满足情况的最右端的端点就好,然后统计对答案的贡献
区间的个数会爆掉int,记得开long long
二分的时候直接将l or r 当成区间的端点可能不太准确,需要将每次的mid用一个变量记录下来
二分代码:
typedef int itn;
int n,k;
ll a[maxn];
ll s[maxn];
ll sxor[maxn];
int main()
{
n = read;
for(int i=1;i<=n;i++) a[i] = read;
for(int i=1;i<=n;i++){
s[i] = s[i-1] + a[i];
sxor[i] = sxor[i-1] ^ a[i];
}
ll ans = 0;
for(int i=1;i<=n;i++){
int l = i,r = n;
int t = 0;
while(l <= r){
int md = (r + l) >> 1;
if(s[md] - s[i-1] == (sxor[md] ^ sxor[i-1])){
l = md + 1;
t = md;
}
else r = md - 1;
}
ans += t - i + 1;
}
cout << ans << endl;
return 0;
}
尺取代码:
typedef int itn;
int n,k;
ll a[maxn];
ll s[maxn];
ll sxor[maxn];
int main()
{
n = read;
for(int i=1;i<=n;i++) a[i] = read;
ll ans = 0;
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i],sxor[i] = sxor[i-1] ^ a[i];
ll sum = 0;
int l = 1;
for(int i=1;i<=n;i++){
while((sum^a[i]) != sum + a[i]){
sum ^= a[l];
l ++;
}
sum ^= a[i];
ans += i - l + 1;
}
cout << ans <<endl;
return 0;
}
/**************************************************************
Problem: 7731
Language: C++
Result: 正确
Time:28 ms
Memory:25468 kb
****************************************************************/