1 条题解
-
0
本人没打,写篇题解。话说为啥有人觉得这是 DP 啊?
题目解法
由于异或的逆运算就是自身,所以异或是可以通过类似前缀和的方法来快速求区间和的。那么对于每一个区间,有:
$$\begin{aligned} s_r\oplus s_{l-1} &= k \\ s_r\oplus k&=s_{l-1}\end{aligned}$$定义上一个区间的右端点位置为 ,于是,我们就可以通过枚举右端点 ,如果存在一个 使得 ,那么就存在区间 符合条件了。
代码:
#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; }
- 1
信息
- ID
- 1354
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 197
- 已通过
- 29
- 上传者