sdnu1592 easy problem(线性基)
Description
Albert_s has a multiset S, this question requires you to find a subset T of S that maximizes the expression of xor xor xor .
Input
The first line contains the integer indicating to the size of S.
The second line contains integer 、、、 indicating the element in S.
Output
Output the maximum value of xor xor xor .
Sample Input
4
5 2 8 2
Sample Output
15
得 我孤陋寡闻 这题凉了
线性基:
https://www.cnblogs.com/yangsongyi/p/10692292.html
模板:
void ins(ll x)
{
for(int i = 52 ; i >= 0 ; i-- )
{
if(!( x >> (1ll * i))) continue ;
if(!p[i])
{
p[i] = x ;
break ;
}
x = x ^ p[i] ;
}
}
求完线性基后,贪心求异或最大值,高位数字的贡献要大于它后面所有地位数字的贡献,当前位数上的数异或答案后使得答案更大时,就更新
太菜了太菜了
#include <bits/stdc++.h>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf = 0x3f3f3f3f;
const int N = 60;
const int mod = 998244353;
ll s, p[N];
void ins(ll x)
{
for(int i = 52; i >= 0; --i)
{
if(!(x >> (1ll * i)))
continue;
if(!p[i])
{
p[i] = x;
break;
}
x ^= p[i];
}
}
int main()
{
int n;
while(~scanf("%d", &n))
{
memset(p, 0, sizeof(p));
for(int i = 1; i <= n; ++i)
{
scanf("%lld", &s);
ins(s);
}
ll ans = 0;
for(int i = 52; i >= 0; --i)
{
if((ans ^ p[i]) > ans)
ans ^= p[i];
}
cout<<ans<<'\n';
}
return 0;
}