BZOJ-3687: 简单题

[文章目录]

Description

求一个n个元素的集合{a}的子集的算术和的亦或和。n<=1000<=2*10^6

发现和的种类很小,所以说可以统计每种和的个数,不,是奇偶(1,0)。枚举物品,类似背包来更新每种和的奇偶。发现好像就是每次把01序列左移,然后和原序列取亦或。
bitset优化,时间复杂度O(n*sum/32)

#include <bitset>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
bitset<2001000>bit;
int main()
{
    int n,x; scanf("%d",&n); bit[0]=1;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&x);
        bit=bit^(bit<<x);
    }
    int ans=0;
    for(int i=1;i<=2000000;++i) if(bit[i]) ans^=i;
    printf("%d",ans);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注