zoukankan      html  css  js  c++  java
  • 【BZOJ 4269】再见Xor

    zky学长提供的线性基求法:

    for(int i=1;i<=n;i++)
    for(int j=64;j>=1;j--)
    {
        if(a[i]>>(j-1)&1)
        {
            if(!lb[j]){lb[j]=a[i];break;}
            else a[i]^=lb[j];
        }
    }
    

    Gauss消元求线性基的方法:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define read(x) x=getint()
    using namespace std;
    const int N = 100003;
    int getint() {
    	int k = 0, fh = 1; char c = getchar();
    	for(; c < '0' || c > '9'; c = getchar())
    		if (c == '-') fh = -1;
    	for(; c >= '0' && c <= '9'; c = getchar())
    		k = (k << 1) + (k << 3) + c - '0';
    	return k * fh;
    }
    int n, a[N];
    void Gauss() {
    	int tmp = 0, i;
    	for(int j = 1 << 30; j; j >>= 1) {
    		for(i = tmp + 1; i <= n; ++i)
    			if (a[i] & j)
    				break;
    		if (i > n) continue;
    		swap(a[++tmp], a[i]);
    		for(i = 1; i <= n; ++i)
    			if (i != tmp && a[i] & j)
    				a[i] ^= a[tmp];
    	}
    	n = tmp;
    }
    int main() {
    	read(n);
    	for(int i = 1; i <= n; ++i)
    		read(a[i]);
    	Gauss();
    	int ans = 0;
    	for(int i = 1; i <= n ;++i)
    		ans ^= a[i];
    	printf("%d %d
    ", ans, ans ^ a[n]);
    	return 0;
    }
    

    没了

  • 相关阅读:
    bzoj2400 Spoj 839 Optimal Marks
    01分数规划
    bzoj1565 植物大战僵尸
    bzoj1497 最大获利(最大权闭合子图)
    bzoj3144 切糕
    loj6045 价
    bzoj3894 文理分科
    luogu3731 新型城市化
    快速傅里叶变换(FFT)
    bzoj1030 文本生成器
  • 原文地址:https://www.cnblogs.com/abclzr/p/5444995.html
Copyright © 2011-2022 走看看