Pagini recente » Cod sursa (job #1058991) | Cod sursa (job #2440424) | Cod sursa (job #2427744) | Cod sursa (job #302458) | Cod sursa (job #1591792)
#include<stdio.h>
#include<bitset>
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define MOD 1000000007
using namespace std;
int N,x,par;
string s,t;
int ma, lma=1, rma=1, cnt;
int l[3000100], r[3000100], ind[300100];
inline void add(int j, int x) {
int curr = 0; //root
for(int i=20;i>=0;--i) {
if(x < (1<<i)) {
if(!l[curr]) {
l[curr] = ++cnt;
}
curr = l[curr];
} else {
x -= (1<<i);
if(!r[curr]) {
r[curr] = ++cnt;
}
curr = r[curr];
}
}
ind[curr] = j; //always latest
}
inline void compute(int j, int x) {
int curr = 0, pw = (1<<20);
int ret = 0;
for(int i=20;i>=0;--i) {
if(x >= pw) {
if(!l[curr]) {
curr = r[curr];
} else {
curr = l[curr];
ret += pw;
}
x -= pw;
} else {
if(!r[curr]) {
curr = l[curr];
} else {
curr = r[curr];
ret += pw;
}
}
pw /= 2;
}
if(ret > ma) {
ma = ret;
lma = ind[curr]+1;
rma = j;
}
}
int main() {
freopen("xormax.in","r",stdin);
freopen("xormax.out","w",stdout);
//freopen("input.in","r",stdin);
scanf("%d",&N);
for(int i=0;i<=N;++i) {
if(i) {
scanf("%d",&x);
par = (par ^ x);
x = par;
compute(i,par);
}
add(i,par);
}
printf("%d %d %d\n",ma,lma,rma);
return 0;
}