P3812 【模板】线性基

P3812 【模板】线性基

题目描述

给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大

题解:

把所有数insert进入线性基,把线性基中所有元素xor起来 = ans

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}
const int maxn=60;
ll a[maxn],c[maxn];
int L=60;
bool insert(ll x){
    for(int j=L;j>=0;--j){//从最高位开始看
        if((x&(1ll<<j))==0) continue;

        if(a[j]){//若如主元j已经存在,用a[j]消去x的第j位然后继续
            x ^= a[j];
            continue;
        }   

        //让x当主元j,需要先用第k(k<j)个主元消去x的第k位
        for(int k=j-1;k>=0;k--){
            if(x & (1ll<<k)) x ^= a[k];
        }
        //接着用x去消掉第k(k>j)个主元的第j位
        for(int k=L;k>j;k--){
            if(a[k] & (1ll<<j)) a[k] ^= x;
        }
        a[j] = x;
        return 1; 
    }
    return 0;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        ll x;
        cin>>x;
        insert(x);
    }
    ll w=0;
    for(int i=L;i>=0;i--)
    {
        w^=a[i];
    }
    cout<<w;
}
全部评论

相关推荐

程序员小白条:主要没亮点,项目也是网上的,平平无奇,那只能海投了,奖项总得有一些,然后就是现在最好是前后端都会,自己能做项目并且运维的,要么找星球项目改改,要么找个开源项目改改,自己能拓展功能才是主要的,跟做效率很低很低
点赞 评论 收藏
分享
06-17 21:57
门头沟学院 Java
白友:噗嗤,我发现有些人事就爱发这些,明明已读不回就行了,就是要恶心人
点赞 评论 收藏
分享
我看看你怎么个事来
牛牛爱吃草草:我看看你怎么个事来
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务