本题首先应该记录一个异或前缀和,然后每次在移动端点的同时更新左区间的值的数量,同时我是枚举的端点,所以右边也被统计了.
#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;
}
/*
这样例给的读错题也不奇怪吧.
*/
京公网安备 11010502036488号