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;
    }
  • 相关阅读:
    QT visual stuido 集成插件不能打开ui文件的原因
    KLSudoku 1.2 数独游戏软件发布
    QT for linux 的错误 undefined reference to 'FcFreeTypeQueryFace' 的解决方法
    tp3.2源码解析——入口文件
    关于php调用.net的web service 踩过的坑
    CentOS7 LNMP+phpmyadmin环境搭建(二、LNMP环境搭建)
    CentOS7 LNMP+phpmyadmin环境搭建(一、虚拟机及centos7安装)
    php无限分类
    php的文件引用
    CentOS7 LNMP+phpmyadmin环境搭建(三、安装phpmyadmin)
  • 原文地址:https://www.cnblogs.com/nervendnig/p/9682012.html
Copyright © 2011-2022 走看看