标签:string tin using turn zoj efi clu bsp nim游戏
注意到线性基的非空子集的异或都不是0。
我们的目的就是消出这样一个线性基,是对面再怎么拿,异或和都是1。
从大到小排序消就好了
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 105 using namespace std; long long n,a[maxn],b[maxn],bit[32],ans=0,sum=0; bool vis[32]; bool cmp(long long x,long long y) { return x>y; } int main() { scanf("%lld",&n); for (long long i=1;i<=n;i++) {scanf("%lld",&a[i]);sum+=a[i];} sort(a+1,a+n+1,cmp); for (long long i=1;i<=n;i++) b[i]=a[i]; for (long long i=1;i<=n;i++) for (long long k=31;k>=0;k--) { if (!(a[i]&(1<<k))) continue; if (!vis[k]) {vis[k]=true;ans+=b[i];bit[k]=a[i];break;} else a[i]^=bit[k]; } printf("%lld\n",sum-ans); return 0; }
标签:string tin using turn zoj efi clu bsp nim游戏
原文地址:http://www.cnblogs.com/ziliuziliu/p/6292576.html