01-trie求条
查看原帖
01-trie求条
1049442
OIerror楼主2024/7/12 21:12
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int trie[3100001][2];
int size[100001];
int num[100001]; 
int tot=0;
int n;
void insert(int val)
{
	int u=0;
	for(int i=(1<<30); i>=1; i>>=1)
	{
		int a=bool(val&i);
		size[u]++;
		if(trie[u][a]==0)
		{
			trie[u][a]=++tot;
		}
		u=trie[u][a];
	}
	num[u]=val;
	size[u]++;
}
void remove(int val)
{
	int u=0;
	for(int i=(1<<30); i>=1; i>>=1)
	{
		int a=bool(val&i);
		size[u]--;
		u=trie[u][a];
	}
	num[u]=0;
	size[u]--;
}
int rank(int val)
{
	int u=0;
	int cnt=0;
	for(int i=(1<<30); i>=1; i>>=1)
	{
		int a=bool(val&i);
		if(size[u]==0)
		{
			return -1;
		}
		if(a==1&&trie[u][0]!=0)
		{
			cnt+=size[trie[u][0]];
		}
		u=trie[u][a];
	}
	return cnt+1;
}
int find(int k)
{
	int u=0;
	int cnt=0;
	for(int i=(1<<30);i>=1;i>>=1)
	{
		if(trie[u][0]!=0&&(k<=size[trie[u][0]]+cnt||trie[u][1]==0))
		{
			u=trie[u][0];
		}
		else
		{
			cnt+=size[trie[u][0]];
			u=trie[u][1];
		}
	}
	return num[u];
}
int main()
{
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
	{
		int op,x;
		scanf("%d%d",&op,&x);
		if(op==1)
		{
			insert(x);
		}
		else if(op==2)
		{
			remove(x);
		}
		else if(op==3)
		{
			int cur=rank(x);
			if(cur!=-1)
			{
				printf("%d\n",cur);
			}
		}
		else if(op==4)
		{
			printf("%d\n",find(x));
		}
		else if(op==5)
		{
			insert(x);
			int cur=rank(x)-1;
//			printf("%d",cur);
			if(cur!=-1&&cur>=1)
			{
				printf("%d\n",find(cur));
			}
			remove(x);
		}
		else if(op==6)
		{
			insert(x);
			int cur=rank(x)+1;
//			printf("%d\n",cur);
			if(cur!=-1&&cur<=size[0])
			{
				printf("%d\n",find(cur));
			}
			remove(x);
		}
	}
	return 0;
}
2024/7/12 21:12
加载中...