Pagini recente » Cod sursa (job #507274) | Cod sursa (job #2843274) | Cod sursa (job #2424405) | Cod sursa (job #2310813) | Cod sursa (job #208449)
Cod sursa(job #208449)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
node *nxt[2];
int pos;
};
#define maxn 1024*128
#define maxb 22
node root;
node _alloc_buf[maxn*maxb];
int _alloc_pos;
node* new_node() { return _alloc_buf + _alloc_pos++; };
void insert(int x, int pos)
{
int i;
node* cur = &root;
for (i = maxb - 1; i >= 0; i--) {
int cbit = (x & (1 << i)) ? 1 : 0;
if (! cur->nxt[cbit])
cur->nxt[cbit] = new_node();
cur = cur->nxt[cbit];
}
cur->pos = pos;
}
struct conf {
node *a, *b;
};
void solve()
{
vector<conf> Q, NQ;
conf start;
start.a = start.b = &root;
Q.push_back(start);
int cbit, i, sol = 0;
for (cbit = 0; cbit < maxb; cbit++) {
int ok = 0;
for (i = 0; i < Q.size(); i++) {
if ((Q[i].a->nxt[0] && Q[i].b->nxt[1]) ||
(Q[i].a->nxt[1] && Q[i].b->nxt[0])) {
ok = 1;
break;
}
}
sol = sol*2 + ok;
NQ.clear();
for (i = 0; i < Q.size(); i++) {
int bit;
conf cur = Q[i];
for (bit = 0; bit < 2; bit++)
if (cur.a->nxt[bit] && cur.b->nxt[bit ^ ok]) {
conf nxt;
nxt.a = cur.a->nxt[bit];
nxt.b = cur.b->nxt[bit ^ ok];
NQ.push_back(nxt);
}
}
Q = NQ;
}
//////// gasit solutia maxima
int best_start = -1, best_end = -1;
for (i = 0; i < Q.size(); i++) {
int start, end;
start = Q[i].a->pos; end = Q[i].b->pos;
if (start > end) swap(start, end);
if (end > best_end || (best_end == end && start > best_start)){
best_start = start;
best_end = end;
}
}
printf ("%d %d %d\n", sol, best_start + 1, best_end);
}
int N;
int main()
{
int i, x, y, cbit, nbits;
freopen ("xormax.in", "rt", stdin);
freopen ("xormax.out", "wt", stdout);
scanf ("%d", &N);
insert (0, 0);
for (i = 1, y = 0; N--; i++) {
scanf ("%d", &x);
y ^= x;
insert(y, i);
}
solve();
return 0;
}