可以相当当前位置,要么是前一位的答案,要么是新组成值为k的队列。所以我们可以记录前缀异或和,就可以比较方便地转移了。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e5+10;
int dp[N],pos[N],n,k,sum,res;
signed main(){
cin>>n>>k; pos[0]=1;
for(int i=1,x;i<=n;i++){
scanf("%d",&x); sum^=x;
dp[i]=dp[i-1];
if(pos[sum^k]) dp[i]=max(dp[i],dp[pos[sum^k]]+1);
pos[sum]=i; res=max(res,dp[i]);
}
cout<<res;
return 0;
}