Pagini recente » Cod sursa (job #2357442) | Cod sursa (job #1932157) | Cod sursa (job #2287346) | Cod sursa (job #1444455) | Cod sursa (job #2225143)
#include <fstream>
#include <vector>
#define BITS 25
#define VAL 100005
using namespace std;
ifstream fin("xormax.in");
ofstream fout("xormax.out");
struct NOD
{
int V;
NOD *urm[2];
};
NOD *cap=new NOD;
NOD *A[2], *X[4];
int N, i, j, nr, en, be, mn;
int P[BITS], sum[VAL], ind;
void ADD_IN_TRIE(int cop)
{
A[0]=cap;
for (j=20; j>=0; j--)
{
if (cop>=P[j])
{
cop-=P[j];
if (A[0]->urm[1]==NULL)
A[0]->urm[1]=new NOD;
A[0]=A[0]->urm[1];
}
else
{
if (A[0]->urm[0]==NULL)
A[0]->urm[0]=new NOD;
A[0]=A[0]->urm[0];
}
A[0]->V=i;
}
}
int main()
{
fin >> N;
P[0]=1;
for (i=1; i<=20; i++)
P[i]=P[i-1]*2;
i=0;
ADD_IN_TRIE(0);
for (i=1; i<=N; i++)
{
fin >> nr;
sum[i]=sum[i-1] ^ nr;
ADD_IN_TRIE(sum[i]);
}
A[0]=A[1]=cap;
for (i=20; i>=0; i--)
{
nr=ind=0;
mn=P[20]*2;
for (j=0; j<2; j++)
{
X[j]=A[0]->urm[j];
if (X[j]!=NULL)
{
nr++;
if (X[j]->V<mn)
{
mn=X[j]->V;
ind=j;
}
}
X[j+2]=A[1]->urm[j];
if (X[j+2]!=NULL)
{
nr++;
if (X[j+2]->V<mn)
{
mn=X[j+2]->V;
ind=j+2;
}
}
}
if (nr==4)
{
A[ind / 2]=A[ind / 2]->urm[ind % 2];
A[1-(ind / 2)]=A[1-(ind / 2)]->urm[1-(ind % 2)];
continue;
}
if (A[0]->urm[0]==NULL)
{
A[0]=A[0]->urm[1];
if (A[1]->urm[0]!=NULL)
A[1]=A[1]->urm[0];
else
A[1]=A[1]->urm[1];
continue;
}
if (A[0]->urm[1]==NULL)
{
A[0]=A[0]->urm[0];
if (A[1]->urm[1]!=NULL)
A[1]=A[1]->urm[1];
else
A[1]=A[1]->urm[0];
continue;
}
if (A[1]->urm[0]==NULL)
{
A[1]=A[1]->urm[1];
if (A[0]->urm[0]!=NULL)
A[0]=A[0]->urm[0];
else
A[0]=A[0]->urm[1];
continue;
}
if (A[1]->urm[1]==NULL)
{
A[1]=A[1]->urm[0];
if (A[0]->urm[1]!=NULL)
A[0]=A[0]->urm[1];
else
A[0]=A[0]->urm[0];
continue;
}
}
be=min(A[0]->V, A[1]->V);
en=max(A[0]->V, A[1]->V);
fout << (sum[be] ^ sum[en]) << " " << be+1 << " " << en << '\n';
fin.close();
fout.close();
return 0;
}