http://train.usaco.org/usacoprob2?a=Hfv8bxVT1Ac&S=cowxor
题目大意:一串N个数(可能有相同),求出异或最大的序列,有相同解则取结尾靠前的,再相同则取短的
字典树,在字典树里标记位置
/*
ID: frontie1
TASK: cowxor
LANG: C++
*/
#include <iostream>
#include <cstdio>
using namespace std;
struct node
{
int child[2];
node()
{
child[0] = child[1] = 0;
}
};
node arr[1500000];
int e = 1;
int data = 0;
int tem;
int N;
int fina = -1;
int st = 1, ed = 1;
int tem_st, pot;
void add(int num, int cnt)
{
int tem;
int cur = 0;
for(int i = 20; i >= 0; --i){
tem = (num >> i) & 1;
if(arr[cur].child[tem] == 0) arr[cur].child[tem] = e++;
cur = arr[cur].child[tem];
}
arr[cur].child[0] = arr[cur].child[1] = cnt;
}
int calculate(int num, int &cnt)
{
int output = 0;
int cur = 0;
for(int i = 20; i >= 0; --i){
tem = (num >> i) & 1;
if(arr[cur].child[tem^1] == 0){
cur = arr[cur].child[tem];
}
else{
output += (1 << i);
cur = arr[cur].child[tem^1];
}
}
cnt = arr[cur].child[0];
return output;
}
int main()
{
freopen("cowxor.in", "r", stdin);
freopen("cowxor.out", "w", stdout);
cin >> N;
add(0, 0);
for(int i = 1; i <= N; ++i){
cin >> tem;
data ^= tem;
pot = calculate(data, tem_st);
add(data, i);
if(pot > fina){
fina = pot;
st = tem_st+1;
ed = i;
}
}
//st = min(st, ed);
cout << fina << ' ' << st << ' ' << ed << endl;
return 0;
}