zoukankan      html  css  js  c++  java
  • hdu 4825 && acdream 1063 01字典树异或问题

    题意:

      给一个集合,多次询问,每次给一个k,问你集合和k异或结果最大的哪个

    题解:

      经典的01字典树问题,学习一哈.

      把一个数字看成32位的01串,然后查找异或的时候不断的沿着^为1的路向下走即可

    #include <bits/stdc++.h>
    #define endl '
    '
    #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
    using namespace std;
    const int maxn=1e5+10,maxm=2e6+10;
    int casn,n,m,k,num[maxn];
    struct Trie{
    	int next[maxn*32][2],size;
    	ll val[maxn*32];
    	void init(){
    		size=0;
    		memset(next,0,sizeof next);
    		memset(val,0,sizeof val);
    	}
    	void insert(ll x){
    		int cur=0;
    		for(int i=32;i>=0;i--){
    			int k=(x>>i)&1;
    			if(!next[cur][k]) next[cur][k]=++size;
    			cur=next[cur][k];
    		}
    		val[cur]=x;
    	}
    	ll find(ll x){
    		int cur=0;
    		for(int i=32;i>=0;i--){
    			int k=(x>>i)&1;
    			if(next[cur][k^1])cur=next[cur][k^1];
    			else cur=next[cur][k];
    		}
    		return val[cur];
    	}
    }trie;
    string s[maxn];
    
    int main() {
    	IO;
    	cin>>casn;
    	int __=0;
    	while(casn--){
    		cin>>n>>m;
    		trie.init();
    		cout<<"Case #"<<++__<<":"<<endl;
    		while(n--){
    			ll x;
    			cin>>x;
    			trie.insert(x);
    		}
    		while(m--){
    			ll x;
    			cin>>x;
    			cout<<trie.find(x)<<endl;
    		}
    	}
    	return 0;
    }
    

    acdream 1063 代码

    #include <bits/stdc++.h>
    #define endl '
    '
    #define ll long long
    #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
    using namespace std;
    const int maxn=1e5+10,maxm=2e6+10;
    int casn,n,m,k,num[maxn];
    struct Trie{
    	int next[maxn*32][2],size;
    	ll val[maxn*32];
    	void init(){
    		size=0;
    		memset(next,0,sizeof next);
    		memset(val,0,sizeof val);
    	}
    	void insert(ll x){
    		int cur=0;
    		for(int i=32;i>=0;i--){
    			int k=(x>>i)&1;
    			if(!next[cur][k]) next[cur][k]=++size;
    			cur=next[cur][k];
    		}
    		val[cur]=x;
    	}
    	ll find(ll x,bool flag){
    		int cur=0;
    		for(int i=32;i>=0;i--){
    			int k=(x>>i)&1;
    			if(flag){
    				if(next[cur][k^1]) cur=next[cur][k^1];
    				else cur=next[cur][k];
    			}else {
    				if(next[cur][k])cur=next[cur][k];
    				else cur=next[cur][k^1];
    			}
    		}
    		return val[cur];
    	}
    }trie;
    
    int main() {
    	IO;
    	cin>>casn;
    	while(casn--){
    		cin>>n;
    		trie.init();
    		while(n--){
    			ll x;
    			string s;
    			cin>>s>>x;
    			if(s=="insert") trie.insert(x);
    			else if(s=="qmin") cout<<(x^trie.find(x,0))<<endl;
    			else cout<<(x^trie.find(x,1))<<endl;
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    算法·进阶石
    How can I determine whether a 2D Point is within a Polygon?
    直线射线线段的相交判断
    关于时间的感想
    企业级自定义表单引擎解决方案(七)--视图模型管理
    GB28181安防Web无插件流媒体平台LiveGBS如何配置集群部署增加并发播放和录像
    接口测试之object []如何类型传参
    Excel2010工作簿被锁定,无法复制或者新增加sheet表格。
    drawio下载
    alsa-amixer-api
  • 原文地址:https://www.cnblogs.com/nervendnig/p/9682012.html
Copyright © 2011-2022 走看看