Pagini recente » Cod sursa (job #2901949) | Cod sursa (job #2032008) | Cod sursa (job #3229452) | Cod sursa (job #1950550) | Cod sursa (job #2049388)
#include <fstream>
using namespace std;
ifstream fin("xormax.in");
ofstream fout("xormax.out");
struct trie
{
trie *next[2];
int val;
}*d,*p;
int n,x[2],val,in,Max=0,init,fi;
void mx(int val,int &sum,int &poz)
{
sum=0;
for(int i=21;i>=0;i--)
{
bool bit=(((1<<i)&val)!=0);
bool bit1=bit;
if(p->next[1-bit]!=0)
bit1=1-bit;
sum=sum*2+(bit^bit1);
poz=p->val;
p=p->next[bit1];
}
}
void adauga(int val,int act)
{
for(int i=21;i>=0;i--)
{
bool bit=(((1<<i)&val)!=0);
if(p->next[bit]==0)
{
trie *s=new trie;
s->next[0]=0;
s->next[1]=0;
p->next[bit]=s;
p=s;
p->val=act+1;
}
else
{
p=p->next[bit];
}
}
}
int main()
{
fin>>n;
d=new trie;
d->next[0]=0;
d->next[1]=0;
p=d;
for(int i=0;i<=21;i++)
{
trie *s=new trie;
s->next[0]=0;
s->next[1]=0;
p->next[0]=s;
p=s;
p->val=1;
}
for(int i=1;i<=n;i++)
{
fin>>x[1];
p=d;
x[1]=x[0]^x[1];
mx(x[1],val,in);
if(Max<val)
{
Max=val;
init=in;
fi=i;
}
p=d;
adauga(x[1],i);
x[0]=x[1];
}
fout<<Max<<" "<<init<<" "<<fi;
return 0;
}