平衡树
Time Limit: 4000/2000MS (Java/Others)
Memory Limit: 128000/64000KB (Java/Others)
Problem Description
神奇的cxlove有一颗平衡树,其树之神奇无法用语言来描述 OrzOrz。 这棵树支持3种操作: 1、加入一个数到树中,维护平衡树的合法性; 2、给一个数X,用O(1)的时间求出来树中的数Y使得 Y ^ X 最大(异或操作, Pascal 写作 xor , 0 ^ 0 = 0 , 1 ^ 1 = 0 , 0 ^ 1 = 1 , 1 ^ 0 = 1 , 2 ^ 3 = 1) 3、给一个数X,用O(1)的时间求出来树中的数Y使得 Y ^ X 最小(异或操作, Pascal 写作 xor , 0 ^ 0 = 0 , 1 ^ 1 = 0 , 0 ^ 1 = 1 , 1 ^ 0 = 1 , 2 ^ 3 = 1) 请你帮忙实现这颗树。 cxlove由于过于牛,有些事情是无法做到的,你能在1s以内通过就好了。 最后补充一句,cxlove是世界冠军!
Input
第一行是数据组数T (T ≤ 100)。
对于每组数据,第一行是操作数N (N ≤ 10000)。
以下 N 行,每行一个字符串一个数字,分别代表:
- insert X ,加入数 X
- qmax X ,求第2种操作的答案
- qmin X ,求第3种操作的答案
输入保证不存在空树Query的情况 (1 ≤ X ≤ 1e9)
Output
对于操作 2 , 3 输出相应的答案。
Sample Input
1 4 insert 1 insert 2 qmin 1 qmax 1
Sample Output
0 3
Hint
Huge input and output. Please do not use: 1. cin ans cout of C++ 2. scanner of Java(Maybe BufferedReader is quicker)
Source
buaads
Point:
多个数寻找异或问题,就用01字典树。
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int maxn = 100000+43;
const int inf = 0x3f3f3f3f;
#define LL long long
int tree[maxn][2];
int sz=0;
void join(int num[])
{
int now=0;
for(int i=32;i>=1;i--){
if(tree[now][num[i]]==0){
tree[now][num[i]]=++sz;
}
now=tree[now][num[i]];
}
}
int q1(int num[])
{
int ans=0;
int now=0;
for(int i=32;i>=1;i--){
if(tree[now][num[i]]==0){
ans|=1<<(i-1);
now=tree[now][num[i]^1];
}else{
now=tree[now][num[i]];
}
}
return ans;
}
int q2(int num[])
{
int ans=0;
int now=0;
for(int i=32;i>=1;i--){
if(tree[now][num[i]^1]!=0){
ans|=1<<(i-1);
now=tree[now][num[i]^1];
}else{
now=tree[now][num[i]];
}
}
return ans;
}
void ins(int num[])
{
join(num);
}
void qmin(int num[])
{
printf("%d\n",q1(num));
}
void qmax(int num[])
{
printf("%d\n",q2(num));
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n;
memset(tree,0,sizeof tree);
sz=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
char s[111];
int x;
scanf("%s%d",s,&x);
int num[33];
for(int i=1;i<=32;i++){
num[i]=x&1;
x>>=1;
}
if(!strcmp(s,"insert")){
ins(num);
}else if(!strcmp(s,"qmin")){
qmin(num);
}else{
qmax(num);
}
}
}
return 0;
}