我给了一个数组A我必须找到一个子数组,使得它的xor值最大。
我正在使用 Trie 。但我在某些测试用例中遇到时间限制超出错误。
我的时间复杂度 O(N * 30 * 2)
约束:
2 ≤ N ≤ 10^5
0 ≤ Ai ≤ 10^9
我的密码:Trie:
static class Batman{
Batman[] N;
long val;
Batman(){
N = new Batman[2];
val=-1;
}
}
插入代码:
public static void insert(int curr){
Batman temp = Root;
int[] A = new int[max+1];
int currs = curr;
for(int i=0;i<=max;i++)
{
A[i] = curr%2;
curr/=2;
}
for(int i=max;i>=0;i--){
if(temp.N[A[i]]==null){
temp.N[A[i]] = new Batman();
}
temp = temp.N[A[i]];
}
temp.val = currs;
}
我的查询代码:
public static long google(int curr){
long yes=0;
Batman temp = Root;
int[] A = new int[max+1];
for(int i=0;i<=max;i++)
{
A[i] = curr%2;
curr/=2;
}
for(int i=max;i>=0;i--){
int t = 1-A[i];
if(temp.N[t]!=null){
temp = temp.N[t];
}else
temp = temp.N[A[i]];
}
return temp.val;
}
获取答案的代码:
insert(0);
xor=0;
for(int i=0;i<n;i++){
xor^=A[i];
insert(xor);
long y = google(xor);
y = y^xor;
ans = Math.max(ans,y);
}
如何让它像Flash一样快速。