【贪心】【线性基】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;
}
posted @ 2015-03-25 21:18  AutSky_JadeK  阅读(192)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト