题解:CF282E Sausage Maximization
思路简述
观察题目,看到异或和最大,自然想到了 01Trie。
前后缀不相交的条件其实不用管,反正一样的数异或起来是 \(0\),不会产生影响。
那么直接用一个 01Trie 维护前缀异或和最大值,然后对于每个后缀异或和找最大就行了。
代码实现
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, c, zotrie[6000005][2];
ll a[100005];
void insert(ll s){
ll u = 0;
for(int i = 62; i >= 0; i--){
bool x = (s >> i) & 1ll;
if(!zotrie[u][x]){
c++;
zotrie[u][x] = c;
}
u = zotrie[u][x];
}
}
ll query(ll s){
ll ans = 0, u = 0;
for(int i = 62; i >= 0; i--){
bool x = (s >> i) & 1ll;
if(zotrie[u][!x]){
ans += (1ll << i);
u = zotrie[u][!x];
}
else u = zotrie[u][x];
}
return ans;
}
int main(){
cin >> n;
ll x = 0;
insert(0); // 可以取前缀为空
for(int i = 1; i <= n; i++){
cin >> a[i];
x ^= a[i];
insert(x);
}
x = 0;
ll mx = 0;
for(int i = n; i >= 1; i--){
x ^= a[i];
mx = max(mx, query(x));
}
cout << mx;
return 0;
}
本文来自博客园,作者:KukCair,转载请注明原文链接:https://www.cnblogs.com/KukCair/p/18995586

浙公网安备 33010602011771号