Cod sursa(job #208448)

Utilizator emilian.mironEmilian Miron emilian.miron Data 16 septembrie 2008 14:57:53
Problema Xor Max Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#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");
    freopen ("xormax.out", "wt");

    scanf ("%d", &N);

    insert (0, 0);
    for (i = 1, y = 0; N--; i++) {
        scanf ("%d", &x);
        y ^= x;
        insert(y, i);
    }

    solve();

    return 0;
}