[bzoj1299]巧克力棒

为了方便考虑,不妨规定只有当当前的巧克力棒都取完了,才能拿新的巧克力棒
然后令先手第一个拿的集合为S,根据nim游戏,当S的xor不为0时先手(即原来的后手)必胜,又轮到先手拿集合,那么只要一直不存在xor为0的集合,先手最终就必败
然后当存在xor为0的集合,那么先手必然可以做到取一个最大xor子集,那么剩下的集合中一定不存在xor为0的子集(否则就可以更大),然后就变成了先手必胜
判断是否存在xor为0的子集可以用线性基来判定(当然这个n太小暴力也行)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,x,s,a[105];
 4 void add(int x){
 5     for(int i=30;i>=0;i--)
 6         if (x&(1<<i))
 7             if (a[i])x^=a[i];
 8             else{
 9                 s++;
10                 a[i]=x;
11                 break;
12             }
13         
14 }
15 int main(){
16     for(int ii=1;ii<=10;ii++){
17         scanf("%d",&n);
18         s=0;
19         memset(a,0,sizeof(a));
20         for(int i=1;i<=n;i++){
21             scanf("%d",&x);
22             add(x);
23         }
24         if (s<n)printf("NO\n");
25         else printf("YES\n");
26     }
27 }
View Code

 

posted @ 2019-11-11 09:03  PYWBKTDA  阅读(111)  评论(0编辑  收藏  举报