Pagini recente » Cod sursa (job #99324) | Cod sursa (job #2653831) | Cod sursa (job #2803233) | Cod sursa (job #648201) | Cod sursa (job #80042)
Cod sursa(job #80042)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXA 3000000
#define MAXN 100005
int A[MAXA], S[MAXN], B[25], nB = 20;
int N;
void binary(int n)
{
int i = nB;
while (i >= 0)
B[i--] = n%2, n /= 2;
}
void add(int n)
{
binary(n);
int i, j = 0;
for (i = 0; i < 21; i++)
if (B[i] == 0)
A[2*j+1] = 1, j = 2*j + 1;
else
A[2*j+2] = 1, j = 2*j + 2;
}
int find(int n)
{
int i, j = 0, v = 0;
binary(n);
for (i = 0; i < 21; i++)
if (B[i] == 0)
if (A[2*j + 2] == 1) // pot sa merg dreapta
v = 2*v + 1, j = 2*j + 2;
else
v = 2*v, j = 2*j + 1;
else
if (A[2*j + 1] == 1)
v = 2*v, j = 2*j + 1;
else
v = 2*v + 1, j = 2*j + 2;
return v;
}
int main()
{
int i, a, p, q, ip, iq, maxim;
memset(A, -1, sizeof(A));
freopen("xormax.in", "rt", stdin);
freopen("xormax.out", "wt", stdout);
scanf("%d", &N);
S[0] = 0;
add(S[0]);
for (i = 1; i <= N; i++)
{
scanf("%d", &a);
S[i] = S[i-1]^a;
add(S[i]);
}
fclose(stdin);
maxim = -1;
for (i = 1; i <= N; i++)
{
a = find(S[i]);
if ((a^S[i]) > maxim)
maxim = (a^S[i]), p = S[i], q = a;
}
printf("%d ", maxim);
for (i = 0; i <= N; i++)
{
if (S[i] == p)
ip = i;
if (S[i] == q)
iq = i;
}
if (ip > iq)
a = ip, ip = iq, iq = a;
printf("%d %d", ip+1, iq);
fclose(stdout);
return 0;
}