本题首先应该记录一个异或前缀和,然后每次在移动端点的同时更新左区间的值的数量,同时我是枚举的端点,所以右边也被统计了.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e3+50,M=4e6+50; int sum[N],num[M]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&sum[i]); sum[i]^=sum[i-1]; }ll ans=0; for(int i=1;i<=n;i++) { for(int j=0;j<i;j++) { num[sum[i]^sum[j]]++; } for(int j=i+1;j<=n;j++) { ans+=num[sum[j]^sum[i]]; } }printf("%lld\n",ans); return 0; } /* 这样例给的读错题也不奇怪吧. */