Pagini recente » Cod sursa (job #1005806) | Cod sursa (job #2981808) | Cod sursa (job #510472) | Cod sursa (job #2269088) | Cod sursa (job #2866694)
#include <bits/stdc++.h>
#warning asta e pentru andu cu trie pe biti
#define EOL -1
using namespace std;
#define cin fin
#define cout fout
ifstream cin("xormax.in");
ofstream cout("xormax.out");
const int nmax = 1e5 + 5; //bounduri ca sa se oftice haterii
namespace Trie {
struct Trie {
Trie* bit[2];
int poz;
Trie() {
poz = 1e9;
memset(bit, 0, sizeof(bit));
}
};
using ts = Trie*;
ts root = new Trie;
void insert(int* s, int val, ts node = root) {
if(s[0] == EOL) {
node -> poz = min(node -> poz, val);
return;
}
if(node -> bit[s[0]] == 0)
node -> bit[s[0]] = new Trie;
insert(s + 1, val, node -> bit[s[0]]);
}
int maxx = -1;
int lf, rh;
bool dfs(ts l = root, ts r = root, int iter = 0, int k = 0) {
if(l == 0 || r == 0)
return 0;
if(iter == 22) {
int clf = l -> poz;
int crh = r -> poz;
if(crh < clf)
swap(crh, clf);
if(k > maxx || (k == maxx && (clf < lf || rh - lf > crh - clf)))
maxx = k, lf = clf, rh = crh;
return 1;
}
if(dfs(l -> bit[0], r -> bit[1], iter + 1, ((k << 1) | 1))
|| dfs(l -> bit[1], r -> bit[0], iter + 1, ((k << 1) | 1)))
return 1;
if(dfs(l -> bit[0], r -> bit[0], iter + 1, (k << 1))
|| dfs(l -> bit[1], r -> bit[1], iter + 1, (k << 1)))
return 1;
return 0;
}
};
int v[nmax]; // vectori ca sa se oftice haterii
int s[40]; // bounduri ca sa se oftice haterii
int main() {
int n;
cin >> n;
for(int i = 0; i <= n; i++) {
if(i != 0)
cin >> v[i], v[i] ^= v[i - 1];
for(int j = 21; j >= 0; j--) {
s[21 - j] = (v[i] & (1 << j)) > 0;
}
s[22] = EOF;
Trie::insert(s, i);
}
Trie::dfs();
if(Trie::lf > Trie::rh)
swap(Trie::lf, Trie::rh);
Trie::lf = min(Trie::rh, Trie::lf + 1);
cout << Trie::maxx << ' ' << Trie::lf << ' ' << Trie::rh << '\n';
}