B3618 寻找团伙
我来发个位运算枚举子集。
题意
给一个
思路
定义
只需要把第
需要注意的是,如果要用 1 << k - x
的方式来算 1ull << k - x
,
因为 1 << k - x
里的 1 是 int
型的,把 int
型的数左移
这样这个集合就求出来了,接下来我们要枚举子集。
我们用一个二进制数来表示每个数选不选,
具体地,s & (1 << i) == 1
代表选择第
现在需要枚举所有的
可以发现,需要枚举
对于每个
代码
#include <cstdio>
unsigned long long p[50], s, u, ans, sum;int n, k;
int main()
{
scanf("%d%d", &n, &k);u = 1 << n;
for(int i = 0, t, x;i < n;++i)
{
scanf("%d", &t);
while(t--) scanf("%d", &x), p[i] |= 1ull << k - x; //注意是 1ull
}
for(;s < u;++s) //枚举 s
{
sum = 0;
for(int i = 0;i < n;++i)
if(s & (1 << i)) sum ^= p[i]; //算出 s 代表的子集的异或和
if(sum > ans) ans = sum; //更新最大值
}
printf("%lld", ans);
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具