Cod sursa(job #1583791)

Utilizator gbibBacotiu Gabi gbib Data 29 ianuarie 2016 12:57:39
Problema Xor Max Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("xormax.in");
ofstream out("xormax.out");

struct Trie{
    Trie *sons[2];
    int best;
    Trie ()
    {
        best=-1;
        sons[0]=sons[1]=NULL;
    }
};

Trie *root=new Trie();
void add(Trie *node, bool v[] ,int i,int ind)
{
    if(i>21)
    {
        if(ind>node->best)
            node->best=ind;
        return;
    }
    if(!node->sons[v[21-i]])
        node->sons[v[21-i]]=new Trie;
    add(node->sons[v[21-i]],v,i+1,ind);
}
int qu(Trie *node, bool v[],int i)
{
    if(i>21)
    {
        return node->best;
    }
    if(node->sons[!v[21-i]])
    {
        return qu(node->sons[!v[21-i]],v,i+1);
    }
    else if(node->sons[v[21-i]])
        return qu(node->sons[v[21-i]],v,i+1);
    return -1;
}
int xorsum[100005];
bool vc[23];
int main()
{int n,mx=0,i,x,j,p,u;
in>>n;
add(root,vc,0,0);
for(i=1;i<=n;i++)
{
    in>>x;
    xorsum[i]=(xorsum[i-1] xor x);

    for(j=0;j<=21;j++)
    {
        vc[j]=(xorsum[i]&(1<<j));
    }
    add(root,vc,0,i);

    int ind= qu(root,vc,0);
    if(xorsum[i]^xorsum[ind]>mx)
    {
        mx=xorsum[i]^xorsum[ind];
        p=ind+1;
        u=i;
    }


}
for(i=1;i<=n;i++)
    out<<xorsum[i]<<" ";
out<<mx<<" "<<p<<" "<<u<<'\n';
    return 0;
}