Pagini recente » Cod sursa (job #2773389) | Cod sursa (job #926216) | Cod sursa (job #3220381) | Cod sursa (job #2161593) | Cod sursa (job #2890065)
#include<bits/stdc++.h>
using namespace std;
struct Trie
{
int poz;
Trie *leg[2];
Trie(int p)
{
poz = p;
leg[0] = leg[1] = NULL;
}
};
Trie *rad;
ifstream fin("xormax.in");
ofstream fout("xormax.out");
char s[10000001];
void Adauga(int w, int ind)
{
int i, j;
Trie *q, *p = rad;
for (i = 20; i >= 0; i--)
{
j = (w >> i) & 1;
if (p->leg[j] != NULL) p = p->leg[j];
else
{
q = new Trie(0);
p->leg[j] = q;
p = q;
}
}
if (p->poz == 0) p->poz = ind;
}
void ValMax(int w, int &M, int &P)
{
int i, j;
Trie *p = rad;
M = 0;
for (i = 20; i >= 0; i--)
{
j = (w >> i) & 1;
if (p->leg[1-j] != NULL)
{
M = M | (1 << i);
p = p->leg[1 - j];
}
else if (p->leg[j] != NULL) p = p->leg[j];
else {P = p->poz; return;}
}
P = p->poz;
}
int main()
{
int n, i, w, x, answer = -1, st, dr, v, P, j = 0;
rad = new Trie(0);
fin >> n; fin.get();
fin.getline(s, 10000000);
w = st = dr = 0;
for (i = 0; s[i] != 0; )
if (s[i] == ' ') i++;
else
{
x = 0;
while ('0' <= s[i] && s[i] <= '9')
x = x * 10 + (s[i++] - '0');
j++;
if (answer < x)
{
answer = x;
st = dr = j;
}
w = w ^ x;
if (i > 1)
{
ValMax(w, v, P);
if (answer < v)
{
answer = v;
st = P + 1; dr = j;
}
}
Adauga(w, j);
}
fout << answer << " " << st << " " << dr << "\n";
fout.close();
return 0 ;
}