Pagini recente » Cod sursa (job #642348) | Cod sursa (job #1964781) | Cod sursa (job #1434305) | Cod sursa (job #650986) | Cod sursa (job #575885)
Cod sursa(job #575885)
#include <cstdio>
#include <string>
#include <cstring>
#define MAXN 100010
using namespace std;
struct Trie {
Trie *fiu[2];
int end;
Trie () {
fiu[0] = fiu[1] = 0;
end = 0;
}
};
Trie *T = new Trie;
int N, i, X[MAXN], Sol = -1, SolX, SolY;
void Insert (Trie *R, int Val, int Bit)
{
if (Bit == -1) {
R -> end = i;
return ;
}
int x = (((1 << Bit) & Val) >> Bit);
if (R -> fiu[x] == 0)
R -> fiu[x] = new Trie;
Bit -= 1;
Insert (R -> fiu[x], Val, Bit);
}
void Query (int Val, int Bit)
{
Trie *R = T;
while (Bit != -1) {
int x = ((Val & (1 << Bit)) >> Bit);
if (R -> fiu[x ^ 1])
R = R -> fiu[x ^ 1];
else R = R -> fiu[x];
Bit -= 1;
}
if (Sol < (Val ^ X[R -> end])) {
Sol = Val ^ X[R -> end];
SolX = R -> end + 1;
SolY = i;
}
}
int main ()
{
freopen ("xormax.in", "r", stdin);
freopen ("xormax.out", "w", stdout);
scanf ("%d\n", &N);
int A;
Insert (T, 0, 24);
for (i = 1; i <= N; i++) {
scanf ("%d", &A);
X[i] = X[i - 1] ^ A;
Query (X[i], 24);
Insert (T, X[i], 24);
}
printf ("%d %d %d\n", Sol, SolX, SolY);
return 0;
}