题目大意
给你一个非负整数数列 A A A 和整数 K K K,请你求出从 A A A 中选择 K K K 个不同的元素时,它们互相异或的最大结果是多少。
解法
当我们使用普通的 DFS 解法时,肯定会超时,因此我们就要加一点点优化:对于把所有后面没选的数值给选上后刚好选了 K K K 个的情况,我们可以不用一步一步选,而是直接异或上后面没选的结果。那怎么直接异或上后面的结果,我们可以直接预处理一个数组 F F F 来存放从第 i i i 个数异或到最后一个数的结果,然后直接调用就行了。
AC代码
#include<bits/stdc++.h>
#define int long long//记得开long long
using namespace std;
int n,k,ans,a[500005],f[500005];
void dfs(int x,int js,int s){
if(js==k)//当正常直接选到 k 个数时
ans=ans>s?ans:s;
else if(x+k-js==n+1)//小优化
ans=max(ans,s^f[x]);
else
dfs(x+1,js+1,s^a[x]),dfs(x+1,js,s);//异或上还是不异或
}
main(){
//输入
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=n;i>=1;i--){
//预处理数组 f
f[i]=f[i+1]^a[i];
}
dfs(1,0,0);
cout<<ans;
return 0;
}