Cod sursa(job #1590086)

Utilizator timicsIoana Tamas timics Data 4 februarie 2016 18:30:10
Problema Xor Max Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#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 x) {
    int curr = 0; //root
    for(int i=20;i>=0;--i) {
        if(s[i] == '0') {
            if(!l[curr]) {
                l[curr] = ++cnt;
            }
            curr = l[curr];
        } else {
            if(!r[curr]) {
                r[curr] = ++cnt;
            }
            curr = r[curr];
        }
    }
    ind[curr] = x; //always latest
}

inline void compute(int x) {
    int curr = 0, pw = (1<<20);
    int ret = 0;
    for(int i=20;i>=0;--i) {
        if(s[i] == '1') {
            if(!l[curr]) {
                curr = r[curr];
            } else {
                curr = l[curr];
                ret += 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 = x;
    }
}

int main() {
	freopen("xormax.in","r",stdin);
	freopen("xormax.out","w",stdout);
	//freopen("input.in","r",stdin);
	for(int i=0;i<21;++i) {
        t.pb('0');
    }
    scanf("%d",&N);
    for(int i=0;i<=N;++i) {
        s = t;
        if(i) {
            scanf("%d",&x);
            par = (par ^ x);
            x = par;
            for(int j=0;j<21;++j) {
                if(x%2) s[j] = '1';
                x /= 2;
            }
            compute(i);
        }
        add(i);
    }
    printf("%d %d %d\n",ma,lma,rma);
    return 0;
}