首页 > 代码库 > BZOJ3687 计算子集和的异或和
BZOJ3687 计算子集和的异或和
题不知道怎么不见了,bzoj上已经没了3687这题了
题意:给你一个n 然后输入n个数 求这n个数的所有子集的和的异或和
思路:用bitset记录某个数是否在子集和中出现,利用bitset对二进制位的快速大量操作(移位),通过已经求出的子集和求出剩余的子集和
参考代码:
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <map> 5 #include <bitset> 6 #include <stdio.h> 7 #include <vector> 8 #define ll long long 9 using namespace std; 10 11 int main() 12 { 13 ll n,x,ans,sum; 14 while(~scanf("%I64d",&n)) 15 { 16 bitset<200005>b; 17 b[0]=1; 18 sum=ans=0; 19 for(ll i=0; i<n; i++) 20 { 21 scanf("%I64d",&x); 22 b^=b<<x; 23 sum+=x; 24 } 25 for(ll i=1; i<=sum; i++) 26 { 27 if(b[i]) ans^=i; 28 } 29 printf("%I64d\n",ans); 30 } 31 return 0; 32 }
BZOJ3687 计算子集和的异或和
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。