Pagini recente » Cod sursa (job #2165983) | Cod sursa (job #1755240) | Cod sursa (job #1264547) | Cod sursa (job #510933) | Cod sursa (job #1314585)
#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;
}