题解: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;
}
posted @ 2025-07-21 12:54  KukCair  阅读(2)  评论(0)    收藏  举报