首页 > 其他 > 详细

【贪心】【线性基】bzoj2844 albus就是要第一个出场

时间:2015-03-25 23:09:09      阅读:176      评论:0      收藏:0      [点我收藏+]

引用题解: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;
}

【贪心】【线性基】bzoj2844 albus就是要第一个出场

原文:http://www.cnblogs.com/autsky-jadek/p/4366962.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!