题面复杂,但是总结过后是n里面找k个,能不能让它们的异或和为0。
#include<bits/stdc++.h>
using namespace std;
int a[35];
set<int> s[35];//选了i个的所有结果
int t,n,k;
bool flag;
void dfs1(int u,int cnt,int sum){
if(u==n/2+1){
s[cnt].insert(sum);
return;
}
dfs1(u+1,cnt,sum);//不选
dfs1(u+1,cnt+1,sum^a[u]);//选
return;
}
void dfs2(int u,int cnt,int sum){
if(flag)return;
if(u==n+1){
for(auto elem : s[k-cnt]){
if(elem==sum){
flag=1;
return;
}
}
return;
}
dfs1(u+1,cnt,sum);//不选
dfs1(u+1,cnt+1,sum^a[u]);//选
}
int main(){
cin >> t;
while(t--){
cin >> n >> k;
for(int i=1;i<=n;i++){
cin >> a[i];
s[i].clear();
}
flag=0;
dfs1(1,0,0);
dfs2(n/2+1,0,0);
if(flag) cout<<"yes\n";
else cout<<"no\n";
}
return 0;
}
数据范围很大,于是信心满满地写了双向搜索(?然后MLE了QwQ