Pagini recente » Cod sursa (job #2810542) | Cod sursa (job #656820) | Cod sursa (job #1578927) | Cod sursa (job #2884094) | Cod sursa (job #2772241)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("xormax.in");
ofstream fout ("xormax.out");
struct nod_arbore
{
nod_arbore *pointer0;
nod_arbore *pointer1;
int valoare;
int indice;
};
void numar_binar (int x, int sir[23])
{
int pozitie_sir=20;
while (x!=0)
{
sir[pozitie_sir] = x%2;
x = x/2;
pozitie_sir--;
}
}
void initializare_nod_arbore_nou (nod_arbore *oarecare)
{
oarecare->pointer0 = NULL;
oarecare->pointer1 = NULL;
oarecare->valoare = 0;
oarecare->indice = 0;
}
void inserare_arbore (nod_arbore *R, int sir[23])
{
nod_arbore *parcurgere = R;
for (int i=0; i<21; i++)
{
if (sir[i]==0)
{
if ((parcurgere->pointer0)==NULL)
{
parcurgere->pointer0 = new nod_arbore;
parcurgere = parcurgere->pointer0;
initializare_nod_arbore_nou(parcurgere);
}
else
parcurgere = parcurgere->pointer0;
}
else if (sir[i]==1)
{
if ((parcurgere->pointer1)==NULL)
{
parcurgere->pointer1 = new nod_arbore;
parcurgere = parcurgere->pointer1;
initializare_nod_arbore_nou(parcurgere);
}
else
parcurgere = parcurgere->pointer1;
}
}
parcurgere->valoare = sir[21];
parcurgere->indice = sir[22];
}
void cautare_maxim (nod_arbore *R, int sir[23], int partial, int &maximul, int &initialul, int &finalul)
{
nod_arbore *parcurgere = R;
for (int i=0; i<21; i++)
{
if (sir[i]==0)
{
if ((parcurgere->pointer1)!=NULL)
parcurgere = parcurgere->pointer1;
else if ((parcurgere->pointer0)!=NULL)
parcurgere = parcurgere->pointer0;
else
return;
}
else if (sir[i]==1)
{
if ((parcurgere->pointer0)!=NULL)
parcurgere = parcurgere->pointer0;
else if ((parcurgere->pointer1)!=NULL)
parcurgere = parcurgere->pointer1;
else
return;
}
}
if (((parcurgere->valoare)^partial)>=maximul)
{
if (parcurgere->indice+1!=sir[22])
{
maximul = ((parcurgere->valoare)^partial);
initialul = parcurgere->indice+1;
finalul = sir[22];
}
}
}
int main()
{
int n; int v[100005];
int partial=0,maximul=0,initialul=0,finalul=0;
nod_arbore *R = new nod_arbore;
initializare_nod_arbore_nou(R);
fin >> n;
for (int i=1; i<=n; i++)
{
fin >> v[i];
partial = partial^(v[i]);
int sir[23]={0};
sir[21] = partial;
sir[22] = i;
numar_binar(partial,sir);
for (int i=0; i<21; i++)
cout << sir[i];
cout << " " << sir[21] << " " << sir[22] << endl << endl;
cautare_maxim(R,sir,partial,maximul,initialul,finalul);
inserare_arbore(R,sir);
}
fout << maximul << " " << initialul << " " << finalul;
return 0;
}