题目:https://codeforces.com/problemset/problem/1109/A
分析:用dp[i]存前i个数的异或和。
al⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕ar 根据异或的性质,也就是说两个区间合并后的区间内的数的异或和为0;
也就数说 dp[r] ^ dp[l - 1] = 0;dp[r] = dp[l - 1];
又因为 r - l + 1是偶数,所以l - 1和r 是同奇偶的。
所以题目转化为 dp[r] = dp[l - 1] && r - l + 1 的区间个数。
之后用一个二维数组cnt[][]第一维存的是dp[i] 第二维存奇偶。
初始cnt[0][0] = 1;
cnt[][] 初始是为 0的;
在一个就是要用 long long;
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 3e5 + 5;
int a[maxn];
int dp[maxn];
int cnt[(1 << 20) + 5][2];
int main()
{
int n;
while(cin >> n)
{
dp[0] = 0;
cnt[0][0] = 1;
long long ans = 0;
for(int i = 1;i <= n;i ++)
{
cin >> a[i];
dp[i] = dp[i - 1] ^ a[i];
ans += cnt[dp[i]][i % 2];
cnt[dp[i]][i % 2] ++;
}
cout << ans <<endl;
}
return 0;
}