对于异或的题目,很多都跟前缀和放在一起,比如说这题,让你求不相交区间异或值相等的个数
很容易想到用前缀和表示区间,现在考虑如何做到不相交并且不重复计算
1.二维循环,第一维从1开始,第二维一个用来统计,一个用来更新
统计的时候,从i开始到n,把这段里面的所有区间的异或值,都看看前面有没有相等的,之后计算
更新的时候从1-i,把前面的所有的区间值都加进去
这样就做到不重不漏
#include<iostream> #include<map> #include<string> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N=5e5+10; int s[N]; int a[N]; int cnt[N]; int main(){ int n; cin>>n; int i; for(i=1;i<=n;i++){ cin>>a[i]; s[i]=s[i-1]^a[i]; } ll res=0; for(i=1;i<=n;i++){ int j; for(j=i;j<=n;j++){ res+=cnt[s[j]^s[i-1]]; } for(j=1;j<=i;j++){ cnt[s[i]^s[j-1]]++; } } cout<<res<<endl; }