Pagini recente » Cod sursa (job #1461920) | Cod sursa (job #9404) | Cod sursa (job #2548211) | Cod sursa (job #20460) | Cod sursa (job #3152792)
#include<bits/stdc++.h>
#pragma GCC optimize ("Ofast")
using namespace std;
struct trie
{
trie *fii[2];
};
trie *initial = new trie();
const int NMAX = 1e5 + 5;
int n, v[NMAX], valxor;
unordered_map<int, int> poz;
void adauga(trie *t, int val, int bit)
{
if(bit == -1)
return;
bool curr_bit = val & (1 << bit);
if(t -> fii[curr_bit] == NULL)
t -> fii[curr_bit] = new trie();
adauga(t -> fii[curr_bit], val, bit - 1);
}
void get_max(trie *t, int val, int bit)
{
if(bit == -1)
return;
bool curr_bit = val & (1 << bit);
if(t -> fii[!curr_bit] != NULL)
{
valxor += 1 << bit;
get_max(t -> fii[!curr_bit], val, bit - 1);
return;
}
get_max(t -> fii[curr_bit], val, bit - 1);
}
void citire()
{
cin >> n;
cin >> v[1];
for(int i = 2; i <= n; i++)
{
int x;
cin >> x;
v[i] = v[i - 1] ^ x;
}
}
void solve()
{
int max1 = v[1], maxst = 0, maxdr = 1;
for(int i = 1; i <= n; i++)
{
//cout << v[i] << " ";
valxor = 0;
adauga(initial, v[i], 21);
poz[v[i]] = i;
get_max(initial, v[i], 21);
//cout << valxor << "\n";
int cntxor = (valxor ^ v[i]);
if(max1 < valxor)
{
max1 = valxor;
maxst = poz[cntxor];
maxdr = i;
}
}
cout << max1 << " " << maxst + 1 << " " << maxdr;
}
int main()
{
freopen("xormax.in", "r", stdin);
freopen("xormax.out", "w", stdout);
citire();
solve();
}