Cod sursa(job #1314585)

Utilizator retrogradLucian Bicsi retrograd Data 11 ianuarie 2015 23:28:58
Problema Xor Max Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include<fstream>
#include<vector>

#define SIZE 25

using namespace std;

ifstream fin("xormax.in");
ofstream fout("xormax.out");

struct Nod {
    long long val;
    Nod *next[2];
    Nod() {
        val = 0;
        next[0] = next[1] = NULL;
    }
};
typedef Nod* pNod;
pNod root = new Nod();

vector<long long> SUM;
long long n, elem, xormax, b, e, maxi;
bool BITS[SIZE+1];
vector<bool> XOR;

void getBits(long long n) {
    for(long long i=SIZE; i; i--) {
        BITS[i] = n%2;
        n /= 2;
    }
}

void addToTree(long long i) {
    pNod node = root;
    for(long long j=0; j<=SIZE; j++) {
        bool bit = BITS[j];
        pNod next = node -> next[bit];
        if(next == NULL) {
            next = new Nod();
            node -> next[bit] = next;
        }
        node = node -> next[bit];
    }
    if(node -> val == 0) {
    node -> val = i;
    }
}
int bb, ee;
void findXor(pNod root1, pNod root2, long long X1, long long X2) {
    if(root1 -> next[1] == NULL and root1 -> next[0] == NULL) {
        bb = root1 -> val;
        ee = root2 -> val;
        if(bb > ee) swap(bb, ee);
        if(bb == ee) return;
        bb++;

        if(xormax < (X1 xor X2) || (xormax == (X1 xor X2) and ee < e) ||
           (xormax == (X1 xor X2) and ee == e and bb > b)){
           xormax = (X1 xor X2);
           b = bb;
           e = ee;
        }
        return;
    }

    bool good = false;

    if(root1 -> next[0] and root2 -> next[1]) {
        findXor(root1 -> next[0], root2 -> next[1], 2*X1, 2*X2+1);
        good = true;
    }
    if(root1 -> next[1] and root2 -> next[0]) {
        findXor(root1 -> next[1], root2 -> next[0], 2*X1+1, 2*X2);
        good = true;
    }

    if(!good) {
        if(root1 -> next[0])
            findXor(root1 -> next[0], root2 -> next[0], 2*X1, 2*X2);
        else
            findXor(root1 -> next[1], root2 -> next[1], 2*X1+1, 2*X2+1);
    }
}

int main() {
    fin>>n;
    SUM.push_back(0);
    for(long long i=1; i<=n; i++) {
        fin>>elem;
        SUM.push_back(SUM[i-1] xor elem);
        if(maxi < elem) {
            maxi = elem;
            b = e = i;
        }
    }
    xormax = maxi;
    if(n>1) {
    for(long long i=1; i<=n; i++) {
        getBits(SUM[i]);
        addToTree(i);
    }
    findXor(root, root, 0, 0);
    }
    fout<<xormax<<" "<<b<<" "<<e;

    return 0;
}