zoukankan      html  css  js  c++  java
  • P3812 【模板】线性基(求最大值)

    题目背景

    这是一道模板题。

    题目描述

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

    输入输出格式

    输入格式:

    第一行一个数n,表示元素个数

    接下来一行n个数

    输出格式:

    仅一行,表示答案。

    输入输出样例

    输入样例#1: 复制
    2
    1 1
    输出样例#1: 复制
    1

    说明

    1≤n≤50,0≤Si≤250 1 leq n leq 50, 0 leq S_i leq 2 ^ {50} 1n50,0Si250

    CODE:
     1 #include <bits/stdc++.h>
     2 #define N 51
     3 #define ll long long
     4 using namespace std;
     5 
     6 int n;
     7 ll ans;
     8 ll a[N], p[101];
     9 
    10 inline ll read()
    11 {
    12     char ch = getchar();
    13     ll x = 0, f = 1;
    14     while(ch > '9' || ch < '0')
    15     {
    16         if(ch == '-')
    17             f = -1;
    18         ch = getchar();
    19     }
    20     while(ch >= '0' && ch <= '9')
    21     {
    22         x = x * 10 + ch - '0';
    23         ch = getchar();
    24     }
    25     return x * f;
    26 }
    27 
    28 void Get_LB(ll x)
    29 {
    30     for(int i = 62; i >= 0; i--)
    31     {
    32         if(!(x >> (ll)i))
    33             continue;
    34         if(!p[i])
    35         {
    36             p[i] = x;
    37             break;
    38         }
    39         x ^= p[i];
    40     }
    41 }
    42 
    43 int main()
    44 {
    45     n = read();
    46     for(int i = 1; i <= n; i++)
    47         Get_LB(a[i] = read());
    48       ///  for(int i=0;i<=62;i++)cout<<p[i]<<" ";cout<<endl;
    49     for(int i = 62; i >= 0; i--)
    50         if((ans ^ p[i]) > ans)
    51             ans ^= p[i];
    52     cout << ans;
    53      return 0;
    54 
    55 }
  • 相关阅读:
    Docker 容器知识点
    Docker 常用命令
    杜教筛
    后缀自动机相关
    期望DP
    从零开始的莫比乌斯反演(函数)[详细推导]
    欧拉函数|(扩展)欧拉定理|欧拉反演
    优美诗词(持续更新)
    魔法 [线段树优化DP]
    stone2 [期望]
  • 原文地址:https://www.cnblogs.com/zhangbuang/p/11107998.html
Copyright © 2011-2022 走看看