#include<iostream>
#include<unordered_map>
#include<algorithm>
using namespace std;
int getMaxLen(int arr[], int length){
if(length == 0)
return 0;
unordered_map<int,int> map;
map[0] = -1;
// map.insert(make_pair(0,-1));
int xor_ =0;
int len =0;
int* dp = new int[length];
//对于每一个当前i: 其最大分割 异或和=0 数组 个数 这样找
// 对于 最后一个i 在 最后一个 以他结尾的小分组中,若这个小分组 异或和不为0,则 dp[i] == dp[i-1]。
// 若 最后一个 小部分 的异或和为0, 则 从开头到i这个位置有一个异或和xor1, 若我们找到一个k 位置,在k位置上,从开始异或和到k的值也为xor1,则必有
// k+1 位置 到 i位置的异或和 为0. 从而 dp[i]位置的值 为 dp[k] + 1
// 0 - i 异或和 xor1 ,0-k异或和 xor1, 则 设 k+1 - i 异或和 为xor2, 由于xor1 ^ xor2 = xor1 ,所以xor2必为0;
for(int i=0;i<length;i++){
xor_ ^= arr[i];
if(map.find(xor_) != map.end()){
int pre = map.find(xor_)->second;
dp[i] = (pre == -1)?1 : dp[pre]+1;
}
if(i>0){
dp[i] = max(dp[i],dp[i-1]);
}
map[xor_] = i;
len = max(dp[i],len);
}
return len;
}
int main(){
int n,aim;
cin >> n;
int* arr = new int[n];
for(int i=0;i<n;i++){
cin >> arr[i];
}
cout << getMaxLen(arr, n);
return 0;
}#include<iostream>
#include<unordered_map>
#include<algorithm>
using namespace std;
int getMaxLen(int arr[], int length){
if(length == 0)
return 0;
unordered_map<int,int> map;
map[0] = -1;
// map.insert(make_pair(0,-1));
int xor_ =0;
int len =0;
int* dp = new int[length];
//对于每一个当前i: 其最大分割 异或和=0 数组 个数 这样找
// 对于 最后一个i 在 最后一个 以他结尾的小分组中,若这个小分组 异或和不为0,则 dp[i] == dp[i-1]。
// 若 最后一个 小部分 的异或和为0, 则 从开头到i这个位置有一个异或和xor1, 若我们找到一个k 位置,在k位置上,从开始异或和到k的值也为xor1,则必有
// k+1 位置 到 i位置的异或和 为0. 从而 dp[i]位置的值 为 dp[k] + 1
// 0 - i 异或和 xor1 ,0-k异或和 xor1, 则 设 k+1 - i 异或和 为xor2, 由于xor1 ^ xor2 = xor1 ,所以xor2必为0;
for(int i=0;i<length;i++){
xor_ ^= arr[i];
if(map.find(xor_) != map.end()){
int pre = map.find(xor_)->second;
dp[i] = (pre == -1)?1 : dp[pre]+1;
}
if(i>0){
dp[i] = max(dp[i],dp[i-1]);
}
map[xor_] = i;
len = max(dp[i],len);
}
return len;
}
int main(){
int n,aim;
cin >> n;
int* arr = new int[n];
for(int i=0;i<n;i++){
cin >> arr[i];
}
cout << getMaxLen(arr, n);
return 0;
}