zoukankan      html  css  js  c++  java
  • HDU 3949 XOR 高斯消元

    题目大意:给定一个数组,求这些数组通过异或能得到的数中的第k小是多少

    首先高斯消元求出线性基,然后将k依照二进制拆分就可以

    注意当高斯消元结束后若末尾有0则第1小是0 特判一下然后k--

    然后HDU输出long long是用%I64d 不管C艹还是G艹都是

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define M 10100
    using namespace std;
    typedef long long ll;
    int n,m,cnt;
    bool zero;
    ll a[M];
    void Gaussian_Elimination()
    {
    	int i,k=0;
    	ll j;
    	for(j=1ll<<62;j;j>>=1)
    	{
    		for(i=k+1;i<=n;i++)
    			if(a[i]&j)
    				break;
    		if(i==n+1)
    			continue;
    		swap(a[i],a[++k]);
    		for(i=1;i<=n;i++)
    			if(i!=k)
    				if(a[i]&j)
    					a[i]^=a[k];
    	}
    	zero=(k!=n);
    	n=k;
    }
    ll Query(ll x)
    {
    	int i;
    	ll re=0;
    	x-=zero;
    	if(!x)
    		return 0;
    	for(i=n;i;i--)
    	{
    		if(x&1)re^=a[i];
    		x>>=1;
    	}
    	if(x)
    		return -1;
    	return re;
    }
    int main()
    {
    	int T,i;
    	ll x;
    	for(cin>>T;T;T--)
    	{
    		printf("Case #%d:
    ",++cnt);
    		cin>>n;
    		for(i=1;i<=n;i++)
    			scanf("%I64d",&a[i]);
    		Gaussian_Elimination();
    		cin>>m;
    		for(i=1;i<=m;i++)
    			scanf("%I64d",&x),printf("%I64d
    ", Query(x) );
    	}
    }
    


  • 相关阅读:
    方法的参数传递机制
    策略模式
    Factory(简单的工厂模式)
    java 跨域问题解决
    Map 转成Json字符串
    FastDFS 上传,删除文件
    MD5 密码加盐
    Java-图片压缩
    调用支付宝人脸采集查询图片Base64解码
    HttpClient工具类
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6747899.html
Copyright © 2011-2022 走看看