天天看點

bzoj3678 簡單題【bitset】

解題思路:

初學bitset,不明覺厲。bitset相當于一個布爾數組,可以快速左移右移。

注意到一個和隻有出現奇數次才有用,是以我們用f[i]表示和為i的集合個數為奇數還是偶數。用bitset維護f數組,那麼f << <script type="math/tex" id="MathJax-Element-1"><<</script>x表示f集合加上x後的集合,但枚舉x時可以不取,是以再用原集合異或一下這個集合就得到了現在的f數組。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<bitset>
#define ll long long
using namespace std;

const int N=;
bitset<N>f;

int main()
{
    //freopen("lx.in","r",stdin);
    int n,x,ans=;
    scanf("%d",&n);
    f[]=;
    while(n--)
    {
        scanf("%d",&x);
        f^=(f<<x);
    }
    for(int i=;i<;i++)
        if(f[i])ans^=i;
    cout<<ans<<'\n';
    return ;
}

           

繼續閱讀