Pagini recente » Cod sursa (job #2117118) | Cod sursa (job #2124859) | Cod sursa (job #2382697) | Cod sursa (job #2047577) | Cod sursa (job #1313690)
#include<fstream>
#include<vector>
#define SIZE 25
using namespace std;
ifstream fin("xormax.in");
ofstream fout("xormax.out");
struct Nod {
vector<long long> val;
Nod *next[2];
Nod() {
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];
}
node -> val.push_back(i);
}
int bb, ee, bbb, eee;
void findXor(pNod root1, pNod root2, long long X1, long long X2) {
if(root1 -> next[1] == NULL and root1 -> next[0] == NULL) {
if(xormax <= (X1 xor X2)) {
xormax = X1 xor X2;
for(int i=0;i<(root1 -> val).size(); i++) {
for(int j=0; j<(root2 -> val).size(); j++) {
bb = root1 -> val[i];
ee = root2 -> val[j];
if(bb > ee) swap(bb, ee);
if(bb == ee) return;
bb++;
if(ee < e || (ee == e && bb > b)) {
e = ee;
b = bb;
}
}
}
}
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 < SUM[i]) {
maxi = SUM[i];
b = 1; 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;
}