Description
Input
The first line contains the integer indicating to the size of S.
The second line contains integer 、、、 indicating the element in S.
Output
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;
}