站外题,玄关(可能大概或许普及+罢)
  • 板块学术版
  • 楼主Kyl_in_2024
  • 当前回复8
  • 已保存回复9
  • 发布时间2024/1/9 21:02
  • 上次更新2024/1/10 11:57:35
查看原帖
站外题,玄关(可能大概或许普及+罢)
965180
Kyl_in_2024楼主2024/1/9 21:02

题面复杂,但是总结过后是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

2024/1/9 21:02
加载中...