bzoj4269

http://www.lydsy.com/JudgeOnline/problem.php?id=4269

裸线性基,一个数取多次就是没取。。。

又有了些新的理解:a数组的前now个元素是基底,也就是可以变成1的位,最大就是所有1都选,次大就是最后一个1不选

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
int n, now;
ll a[N], bin[40];
void gauss()
{
    now = 1;
    for(int i = 31; i >= 0; --i)
    {
        int x = now;
        while(x <= n && !(a[x] & bin[i])) ++x;
        if(x == n + 1) continue;
        swap(a[now], a[x]);
        for(int j = 1; j <= n; ++j) if(j != now && a[j] & bin[i])
            a[j] ^= a[now];
        ++now; //下一个数 ,下一个自由位
    }
    --now;
}
int main()
{
    bin[0] = 1; for(int i = 1; i <= 31; ++i) bin[i] = bin[i - 1] * 2;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    gauss();
    ll ans = 0;
    for(int i = 1; i <= now; ++i) ans ^= a[i];
    printf("%lld %lld\n", ans, ans ^ a[now]); //a[now]是最低的位
    return 0;
}

时间: 2024-10-10 22:56:07

bzoj4269的相关文章

【BZOJ4269】再见Xor 高斯消元

[BZOJ4269]再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. Output 一行,包含两个数,最大值和次大值. Sample Input 3 3 5 6 Sample Output 6 5 HINT 100% : N <= 100000, 保证N个数不全是0,而且在int范围内 题解:大水~ 在线性基上贪心得到最大值,用最大值

【bzoj4269】再见Xor 高斯消元求线性基

题目描述 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 输入 第一行一个正整数N. 接下来一行N个非负整数. 输出 一行,包含两个数,最大值和次大值. 样例输入 3 3 5 6 样例输出 6 5 题解 高斯消元求线性基裸题 由于线性基可以表示所有能够求出的异或和,所以我们只需要考虑线性基即可. 先求出线性基,然后按照从高位到低位的贪心思想来选择. 由于每个线性基的最高位在之前都没有出现过,所以每次选择一定会使答案增大,故直接

【冲刺noi】真banzi大集合

自己风格的板子 = = 考试时别把板子码错就好 = = 一.数据结构 1.树状数组单点修改区间查询(luogu3374) #include <cstdio> int f[500010] , n; void add(int x , int a) { int i; for(i = x ; i <= n ; i += i & -i) f[i] += a; } int query(int x) { int i , ans = 0; for(i = x ; i ; i -= i &