【贪心】【线性基】bzoj2844 albus就是要第一个出场
引用题解:http://blog.csdn.net/PoPoQQQ/article/details/39829237
注意评论区。
#include<cstdio> using namespace std; #define MOD 10086 #define N 100001 int n,a[N],m,base[32],k,real[32],ans,now; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); scanf("%d",&m); int j; for(int i=1;i<=n;++i) { for(j=31;j>=0;--j)//尝试用所有的线性基去消a[i] if(((a[i]>>j)&1)&&base[j]) a[i]^=base[j]; if(a[i])//若a[i]不能被以前的线性基所表示(线性无关) { for(j=31;j>=0;--j)//把a[i]的剩余部分插入线性基 if(((a[i]>>j)&1)&&(!base[j])) { base[j]=a[i]; break; } for(int k=31;k>j;--k)//从线性基里把新插入的家伙消掉 if((base[k]>>j)&1) base[k]^=a[i]; } } for(int i=0;i<=31;++i) if(base[i]) real[k++]=base[i]; for(int i=k-1;i>=0;--i) if((real[i]^now)<=m) { now^=real[i]; ans=(ans+(1<<i)%MOD)%MOD; } for(int i=0;i<n-k;++i) ans=(ans<<1)%MOD; printf("%d\n",(ans+1)%MOD); return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/