每日一题 4月14日 Xorto 异或枚举区间端点
Xorto
https://ac.nowcoder.com/acm/problem/14247
思路:我们知道[i, j]和区间[x, y]异或为0.那么我们枚举右区间端点。那么每次新增加的贡献为左区间异或值为Xor[x, j]的个数。我们在扫描的时候,可以维护所有的左区间的值和个数。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int a[1005], s[1005];
LL f[1<<20];
int main(){
int n, x; scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
s[i]=s[i-1]^a[i];
}
LL ans=0;
for(int l2=1; l2<=n; l2++){
for(int l1=1; l1<l2; l1++){
f[s[l1-1]^s[l2-1]]++;
}
for(int r2=l2; r2<=n; r2++){
ans+=f[s[l2-1]^s[r2]];
}
}
printf("%lld\n", ans);
return 0;
}