331000 题解:求最大异或值,首先考虑01字典树,我们每次将前I项异或和加入树种,查询后i-1项的的最大值,不断更新答案。 代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define mem(a) memset(a, 0, sizeof(a))
#define eps 1e-5
#define MAX 400030
#define INF 0x3f3f3f3f
//01字典树
//http://blog.csdn.net/qq_33183401/article/details/52263237 加强版
using namespace std;
long long pre[MAX];
long long suf[MAX];
long long a[MAX];
long long dp[MAX];
long long ch[32*MAX][2];
long long val[32*MAX];
long long sz;
void init()
{
sz=1;
mem(ch[0]);
}
void Insert(long long a)
{
long long u=0;
for(int i=31;i>=0;i--)
{
long long c=((a>>i)&1);
if(!ch[u][c])
{
mem(ch[sz]);
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=a;
}
long long query(long long a)
{
long long u=0;
for(int i=31;i>=0;i--)
{
long long c=((a>>i)&1);
if(ch[u][c^1])
u=ch[u][c^1];
else
u=ch[u][c];
}
return val[u]^a;
}//以上为模板
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
init();
long long ert=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ert^=a[i];
}
init();
long long maxn=0;
Insert(0);
long long ins=0,anss=0;
for(int i=1; i<=n; i++){
ins^=a[i]; ert^=a[i];
Insert(ins);
anss=max(anss,query(ert));
}
printf("%lld\n",anss);
}
}
|