Pagini recente » Cod sursa (job #2458485) | Cod sursa (job #2801804) | Cod sursa (job #128484) | Cod sursa (job #3224403) | Cod sursa (job #2188300)
#include <fstream>
#define NMAX 100010
#define PMAX 21
using namespace std;
ifstream fin("xormax.in");
ofstream fout("xormax.out");
struct trie
{
trie *fiu[2];
int poz;
trie()
{
fiu[0] = fiu[1] = 0;
poz = 0;
}
};
struct solutie
{
int s, st, dr;
};
int n, v[NMAX];
trie *t = new trie;
solutie sol;
void inserare(trie *nod, int k, int x, int i);
bool cautare(trie *nod, int k, int x, int s, int i);
int main()
{
int i, x;
fin >> n;
for (i = 1; i <= n; i++)
{
fin >> x;
v[i] = v[i - 1] ^ x;
cautare(t, (1 << PMAX), v[i], 0, i);
inserare(t, (1 << PMAX), v[i], i);
}
fout << sol.s << ' ' << sol.st << ' ' << sol.dr << '\n';
fout.close();
return 0;
}
void inserare(trie *nod, int k, int x, int i)
{
if (!k)
{
nod->poz = i;
return ;
}
if (nod->fiu[(x & k) || 0] == 0)
nod->fiu[(x & k) || 0] = new trie;
inserare(nod->fiu[(x & k) || 0], (k >> 1), x, i);
}
bool cautare(trie *nod, int k, int x, int s, int i)
{
bool gasit = 0, urm;
if (!k)
{
if (s > sol.s)
{
sol.s = s;
sol.dr = i;
sol.st = nod->poz + 1;
}
return 1;
}
urm = (x & k) || 0;
if (nod->fiu[!urm])
gasit = cautare(nod->fiu[!urm], (k >> 1), x, s + k, i);
if (!gasit && nod->fiu[urm])
gasit = cautare(nod->fiu[urm], (k >> 1), x, s, i);
return gasit;
}