题解:P14359 [CSP-J 2025] 异或和 / xor(民间数据)
题意: 给定一个长度为
思路: 由于 map 存可以使区间 upper_bound 一下不小于最后一个区间的结尾,小于
代码:
#include<bits/stdc++.h>
using namespace std;
int a[500010],s[500010],vis=-1,ans,n,k;//vis初始化为-1,因为s[0]也可以用
map<int,vector<int>>mp;
int main(){
cin>>n>>k;
mp[0].push_back(0);
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]^a[i];
mp[s[i]].push_back(i);
}
for(int i=1;i<=n;i++){
auto pl=upper_bound(mp[s[i]^k].begin(),mp[s[i]^k].end(),vis);//求大于vis(即不小于最后一个区间的结尾)的最小j
if(pl==mp[s[i]^k].end())continue;//防止访问空地址导致RE
if(*pl<i)ans++,vis=i-1;
}
cout<<ans<<endl;
}