题解:P14359 [CSP-J 2025] 异或和 / xor(民间数据)
提供一个方便理解的思路
题目读完后,很明显是一个前缀异或,用一个数组存当前下标之前的所有数的异或和,调用跟前缀和一样,例
a[l-1] xor a[r]
| 那什么情况下是最优的呢,当区间长度为 样例 |
2 | 1 | 0 | 3 |
|---|
给第一项,也就是
这里提供一个样例
5 2
1 3 2 1 2
3
| 对所有长度为 |
1 | 3 | 标记 | 1 | 标记 |
|---|
可以看到序列被分为两部分,对每个部分进行的每一项都往前遍历,找到第一个满足异或和为
#include<bits/stdc++.h>
using namespace std;
long long a[500001],b[500001],c[500001];
//a存序列,b存前缀异或,c为标记数组
int main(){
long long n,k,ans=0;//ans记录区间数量
cin>>n>>k;
for(long long i=1;i<=n;i++){
cin>>a[i];
b[i]=b[i-1] xor a[i];//记录从1到i的异或和
if(a[i]==k){//标记长度1的区间
c[i]=1;
ans++;
}
else{
for(long long j=i-1;j>=1;j--){
if(c[j]==1) break;//遇到标记过的就退出循环
if((b[i] xor b[j-1])==k){
ans++;
c[i]=1;//往前遍历,只需标记i项
break;
}
}
}
}
cout<<ans;
return 0;
}