Cod sursa(job #2901169)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 13 mai 2022 09:14:12
Problema Xor Max Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("xormax.in");
ofstream fout("xormax.out");

const int nmax=1e5+5,maxput=21;
int n,maxim,start,ende;
int v[nmax];
int maxpos[(1<<23)+5];
bool trie[(1<<23)+5];

int parcurge_trie(int i)
{
    int bit=maxput;
    int nod=1;
    while(bit>=0)
    {
        bool pi=( ( (1<<bit)&v[i])==0 );
        if(trie[2*nod+pi]==0) pi=!pi;
        nod=2*nod+pi;
        bit--;
    }
    return maxpos[nod];
}

void add_to_trie(int i)
{
    int bit=maxput;
    int nod=1;
    while(bit>=0)
    {
        bool pi=( ( (1<<bit)&v[i])!=0 );
        if(trie[2*nod+pi]==0) trie[2*nod+pi]=1;
        nod=2*nod+pi;
        bit--;
    }
    maxpos[nod]=max(maxpos[nod],i);
}

int main()
{
    fin>>n;
    add_to_trie(0);
    for(int i=1; i<=n; i++)
    {
        fin>>v[i];
        if(maxim<v[i])
        {
            maxim=v[i];
            start=i;
            ende=i;
        }
        v[i]=v[i-1]^v[i];
    }
    for(int i=0; i<=n; i++)
    {
        add_to_trie(i);
        int elem=parcurge_trie(i);
        if(maxim<(v[elem]^v[i]))
        {
            maxim=v[elem]^v[i];
            start=elem+1;
            ende=i;
        }
    }
    fout<<maxim<<" "<<start<<" "<<ende<<" ";
    return 0;
}