BZOJ3687 计算子集和的异或和
Posted %%%%%
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 计算子集和的异或和的主要内容,如果未能解决你的问题,请参考以下文章