Cod sursa(job #2225144)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 26 iulie 2018 00:59:28
Problema Xor Max Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#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];
        }
        if (A[0]->V==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;
}