• 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;
    }
  • 相关阅读:
    Python matplotlib基本设置
    Python可视化工具
    使用Python进行数据分析——常见实用的第三方库
    Python第三方库安装
    Python pip的安装
    Python cx_Oracle数据库连接
    Python安装使用(WinXP)
    大数据学习路线(转载)
    SQL 数据库学习之路-转自大神笔记
    Java字符串处理函数汇总
  • 原文地址:https://www.cnblogs.com/nervendnig/p/9682012.html
Copyright © 2020-2023  润新知