Pagini recente » Statistici Tomuleasa Giovani (Giovani) | Istoria paginii utilizator/teodoracristina | Istoria paginii utilizator/barbie_mia | Diferente pentru autumn-warmup-2007/solutii/runda-3 intre reviziile 41 si 40 | Cod sursa (job #1583791)
#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;
}