Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define f first
- #define s second
- #define ll long long
- #define pb push_back
- #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
- #define mk make_pair
- using namespace std;
- const int MAXN = 1e6 + 5;
- const int INF = 1e9 + 7;
- const int MOD = 1e9 + 7;
- struct trie{
- int links[2];
- int cnt = 0;
- bool leaf = 0;
- } t[MAXN];
- int vertex = 0;
- void add(ll mask){
- int v = 0;
- t[v].cnt++;
- for (int i = 40; i >= 0; i--){
- int bit = (mask >> i) & 1;
- if (t[v].links[bit] == -1){
- vertex++;
- t[v].links[bit] = vertex;
- t[vertex].links[0] = -1;
- t[vertex].links[1] = -1;
- }
- v = t[v].links[bit];
- t[v].cnt++;
- }
- }
- void del(ll mask){
- int v = 0;
- t[v].cnt--;
- for (int i = 40; i >= 0; i--){
- int bit = (mask >> i) & 1;
- v = t[v].links[bit];
- t[v].cnt--;
- }
- }
- ll ffind(ll mask){
- int v = 0;
- ll xxor = 0;
- for (int i = 40; i >= 0; i--){
- int bit = (mask >> i) & 1;
- if (t[v].links[1 ^ bit] != -1 && t[t[v].links[1 ^ bit]].cnt > 0){
- v = t[v].links[1 ^ bit];
- xxor ^= (1LL << i);
- }
- else{
- v = t[v].links[bit];
- }
- }
- return xxor;
- }
- void solve(int Test){
- for (int i = 0; i < 26; i++){
- t[0].links[i] = -1;
- }
- int n;
- cin >> n;
- a[0] = 0;
- for (int i = 1; i <= n; i++){
- cin >> a[i];
- }
- suf[n + 1] = 0;
- add(0);
- add(0);
- suf[0] = 0;
- for (int i = n; i >= 1; i--){
- suf[i] = suf[i + 1] ^ a[i];
- add(suf[i]);
- }
- ll pref = 0;
- ll ans = 0;
- for (int i = 0; i <= n; i++){
- pref ^= a[i];
- del(suf[i]);
- ll best_xor = ffind(pref);
- ans = max(ans, best_xor);
- }
- cout << ans << "\n";
- }
- main() {
- IOS;
- srand(time(0));
- int t = 1;
- cin >> t;
- int T = 1;
- while(t--){
- solve(T);
- T++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment