题解:P14359 [CSP-J 2025] 异或和 / xor(民间数据)
signed_long_long · · 题解
本人没打,写篇题解。话说为啥有人觉得这是 DP 啊?
题目解法
由于异或的逆运算就是自身,所以异或是可以通过类似前缀和的方法来快速求区间和的。那么对于每一个区间,有:
定义上一个区间的右端点位置为
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
ll n,k;
ll a[N],s[N];
ll id[2005000],lst;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]^a[i];
memset(id,-1,sizeof id);
id[0]=0;
ll ans=0;
for(int r=1;r<=n;r++){
ll x=s[r]^k;
if(id[x]>=lst){
ans++;
lst=r;
}
id[s[r]]=r;
}
cout<<ans;
return 0;
}