Pagini recente » Cod sursa (job #916129) | Cod sursa (job #649279) | Cod sursa (job #1159987) | Cod sursa (job #1065753) | Cod sursa (job #3353012)
#include <fstream>
using namespace std;
ifstream cin("xormax.in");
ofstream cout("xormax.out");
int n,v[100005],i,j,val=0,maxx=-1,st,dr;
struct nod
{
int ind=0;
nod* next[2]= {};
};
nod* root=new nod;
nod* aux;
void inserare(int nr,int index)
{
nod* aux=root;
int val;
for(int i=23; i>=0; i--)
{
val=(1<<i)&nr;
if(val!=0)
val=1;
if(aux->next[val]==NULL)
aux->next[val]=new nod;
aux=aux->next[val];
}
aux->ind=index;
}
int main()
{
cin>>n;
for(i=1; i<=n; i++)
{
cin>>v[i];
v[i]^=v[i-1];
inserare(v[i],i);
}
for(i=1; i<=n; i++)
{
aux=root;
for(j=23; j>=0; j--)
{
val=(1<<j)&v[i];
if(val!=0)
val=1;
if(aux->next[1-val]!=NULL)
aux=aux->next[1-val];
else
aux=aux->next[val];
}
if(v[i]^v[aux->ind]>maxx)
{
maxx=v[i]^v[aux->ind];
st=min(i,aux->ind);
dr=max(i,aux->ind);
}
else if(v[i]^v[aux->ind]==maxx && max(i,aux->ind)<dr)
{
st=min(i,aux->ind);
dr=max(i,aux->ind);
}
else if(v[i]^v[aux->ind]==maxx && max(i,aux->ind)==dr && min(i,aux->ind)>st)
{
st=min(i,aux->ind);
dr=max(i,aux->ind);
}
}
cout<<maxx<<' '<<st+1<<' '<<dr;
return 0;
}