trie手快写废,help me
查看原帖
trie手快写废,help me
886055
MoonCake2011楼主2023/5/3 11:13
#include<bits/stdc++.h>
using namespace std;
#define big 30
#define d (int(1e7+10))
struct node{
	node *s[2];
	int siz;
	node(){
		siz=0;
		s[0]=s[1]=NULL;
	}
};
struct trie{
	node *root;
	trie(){
		root=new node;
	}
	inline void insert(int x){
		node *p=root;
		for(int i=big;i>=0;i--){
			bool now=(x & (1<<i));
			if(p->s[now]==NULL)
				p->s[now]=new node;
			p->siz++;
			p=p->s[now];
		}
		p->siz++;
	}
	inline void erase(int x){
		node *p=root,*nxt;
		for(int i=big;i>=0;i--){
			bool now=(x & (1<<i));
			nxt=p->s[now];
			p->siz--;
			if(nxt->siz==1)
				p->s[now]=NULL;
			if(p->siz==0)
				free(p);
			p=nxt;
		}
		p->siz--;
	}
	inline int ranks(int x){
		int rk=0;
		node *p=root;
		for(int i=big;i>=0;i--){
			bool now=(x & (1<<i));
			if(now==1 && p->s[0]!=NULL)
				rk+=p->s[0]->siz;
			if(p->s[now]!=NULL)
				p=p->s[now];
			else
				break;
		}
		return ++rk;
	}
	inline int get(int x){
		int num=0;
		node *p=root;
		for(int i=big;i>=0;i--){
			if (p->s[0]==NULL)
         	   p=p->s[1],num=num<<1|1;
        	else if(p->s[1]==NULL || p->s[0]->siz>=x)
        		p=p->s[0],num=num<<1;
        	else
        		x-=p->s[0]->siz,p=p->s[1],num=num<<1|1;
		} 
		return num;
	}
	inline int pre_find(int x){
		int num=0,fdx=0;
		node *p=root,*lst;
		for(int i=big;i>=0;i--){
			bool now=(x & (1<<i));
			if (now==1 && p->s[0]!=NULL)
           		lst=p->s[0],num=fdx<< 1;
        	if (p->s[now])
           		p=p->s[now];
        	else
        	    break;
        	fdx=fdx<<1|now;
		}
		while(lst)
        	if (lst->s[1])
        	    lst=lst->s[1],num=num<<1|1;
       		else
            	lst=lst->s[0],num=num<<1;
    	return num>>1;
	}
	inline int next_find(int x){
		int num=0,fdx=0;
		node *p=root,*lst;
		for(int i=big;i>=0;i--){
			bool now=(x & (1<<i));
			if (now==0 && p->s[1]!=NULL)
        		lst=p->s[1],num=fdx<<1|1;
        	if (p->s[now])
            	p=p->s[now];
        	else
            	break;
        	fdx=fdx<<1|now;
		}
		while(lst)
			if (lst->s[0])
            	lst=lst->s[0],num=num<<1;
        	else
            	lst=lst->s[1],num=num<<1|1;
		return num>>1;
	} 
}; 
trie t; 
int main() {
	int q;
	cin>>q;
	while(q--){
		int opt,x;
		cin>>opt>>x;
		if(opt==1)
			t.insert(x+d);
		if(opt==2)
			t.erase(x+d);
		if(opt==3)
			cout<<t.ranks(x+d)<<"\n";
		if(opt==4)
			cout<<t.get(x)-d<<"\n";
		if(opt==5)
			cout<<t.pre_find(x+d)-d<<"\n";
		if(opt==6)
			cout<<t.next_find(x+d)-d<<"\n";
	}
	return 0;
} 
2023/5/3 11:13
加载中...