Pagini recente » Cod sursa (job #867270) | Cod sursa (job #2614010) | Cod sursa (job #53311) | Cod sursa (job #541118) | Cod sursa (job #940667)
Cod sursa(job #940667)
#include <fstream>
using namespace std;
struct Trie
{
int indice;
Trie* F[2];
Trie ()
{
indice = 0;
F[0] = F[1] = 0;
}
};
Trie* T = new Trie;
inline int A (int K)
{
if (K) return 1;
return 0;
}
void Add_Number (int N, int bit, Trie* nod, int i)
{
if (bit == -1)
{
nod -> indice = i;
return;
}
int a = A (N & (1 << bit));
if (nod -> F[a] == 0)
{
Trie* aux = new Trie;
nod -> F[a] = aux;
}
Add_Number (N, bit - 1, nod -> F[a], i);
}
int Find_Best_Number (int N, int bit, Trie* nod)
{
if (bit == -1) return nod -> indice;
int a = A (N & (1 << bit));
if (nod -> F[!a] != 0) return Find_Best_Number (N, bit - 1, nod -> F[!a]);
return Find_Best_Number (N, bit - 1, nod -> F[a]);
}
int N;
int v[100011];
int main ()
{
ifstream fin ("xormax.in");
ofstream fout ("xormax.out");
fin >> N;
Add_Number (0, 20, T, 0);
int start = 1, stop = 1, mare = 0;
for (int i = 1; i <= N; i++)
{
fin >> v[i];
v[i] ^= v[i - 1];
int j = Find_Best_Number (v[i], 20, T);
int dog = v[i] ^ v[j];
if (dog > mare)
{
mare = dog;
stop = i;
start = j + 1;
}
Add_Number (v[i], 20, T, i);
}
fout << mare << " " << start << " " << stop;
fin.close ();
fout.close ();
return 0;
}