NC14247-Xorto
Xorto
https://ac.nowcoder.com/acm/problem/14247
知识点:前缀和(可有可无,不过看着舒服...)
题意:给出一个长度为n的数组,求互不重叠的、异或和为零的非空区间对个数。
思路:给出一个从左到右移动的分界线,统计左边异或和值个数,累加左边与右边区间异或和值相同的区间个数。为了防止重复,左边只统计包含分界线的区间,右边只统计与分界线相邻的区间。
代码:
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1005,M=140000;//M的取值大于等于1<<17-1就行 int a[N],b[M]; int main() { int n; ll ans=0; cin>>n; for(int i=1;i<=n;i++) scanf("%d",a+i),a[i]^=a[i-1]; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++) b[(a[i]^a[j-1])]++; for(int k=i+1;k<=n;k++) ans+=b[a[k]^a[i]]; } cout<<ans<<endl; return 0; }