给出n个数字 a_1 a_2 a_3 a_4……a_n,问最多有多少不重叠的非空区间,使得每个区间内数字的异或都等于0 (在某一种分割下,可以得到的异或为0的区间的和最多)
[32101020321040]
#include<map>
class MostEOR{
public:
int mostEOR(vector<int> arr){
int eor = 0;
//dp[i]-->arr[0...i]在最优划分的情况下,异或和为0最多的部分是多少个?
int *dp=new int [arr.size()];
//key:从0出发的某个前缀异或和
//value:这个前缀异或和出现的最晚的位置(index)
map<int,int> m;
m.insert(make_pair(0,-1));//一个数没有时,前缀异或和为0
for(int i=0;i<arr.size();i++){//i所在的最后一块
eor^=arr[i];//xor->0...i所有数的异或和
if(m.find(eor)!=m.end()){//上一次,这个异或和出现的位置
//pre->pre+1->i,最优划分,最后一个部分的开始位置
//(pre+1,i)最后一个部分
int pre=m.find(eor)->second;//a 0...a (a+1...i)
dp[i]=pre==-1?1:(dp[pre]+1);
}
//dp[i] = max(dp[i-1],dp[k-1]+1)
if(i>0){
dp[i]=max(dp[i-1],dp[i]);
}
if(m.find(eor)==m.end()){
m.insert(make_pair(eor,i));
}else{
m[eor]=i;
}
}
return dp[arr.size()-1];
}
};
int main(){
return 0;
}