zoukankan      html  css  js  c++  java
  • HDU 5536 Chip Factory Trie

    题意:

    给出(n(3 leq n leq 1000))个数字,求(max(s_i+s_j) igoplus s_k),而且(i,j,k)互不相等。

    分析:

    把每个数字看成一个(01)字符串插入倒Trie树中去,枚举(i)(j),然后把(s_i)(s_j)从Trie树中删去。
    然后在Trie树中贪心找到能与(s_i+s_j)异或得到的最大值。
    具体匹配的过程中是这样的,首先看树中最高位能否异或得到(1)
    能的话就往能的那个方向走,否则往另外一个方向走。

    另外删除操作是这样实现的,我们每个节点记录一个(val)值。
    插入时对所有经过节点的(val)值加(1),删除就将对应节点的(val)值减(1)
    在树上匹配的时候就只走那些(val)值为正的节点。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 1000 + 10;
    const int maxnode = 100000 + 10;
    
    int n;
    int s[maxn];
    
    int sz;
    int ch[maxnode][2];
    int val[maxnode];
    
    void init() {
    	sz = 1;
    	memset(ch[0], 0, sizeof(ch[0]));
    }
    
    //d=1表示插入,d=-1表示删除
    void update(int v, int d) {
    	int u = 0;
    	for(int i = 30; i >= 0; i--) {
    		int c = (v >> i) & 1;
    		if(!ch[u][c]) {
    			memset(ch[sz], 0, sizeof(ch[sz]));
    			val[sz] = 0;
    			ch[u][c] = sz++;
    		}
    		u = ch[u][c];
    		val[u] += d;
    	}
    }
    
    int match(int v) {
    	int ans = 0, u = 0;
    	for(int i = 30; i >= 0; i--) {
    		int c = (v >> i) & 1;
    		if(ch[u][c^1] && val[ch[u][c^1]]) {
    			ans |= (1 << i);
    			u = ch[u][c^1];
    		}
    		else u = ch[u][c];
    	}
    	return ans;
    }
    
    int main()
    {
    	int T; scanf("%d", &T);
    	while(T--) {
    		init();
    		scanf("%d", &n);
    		for(int i = 1; i <= n; i++) {
    			scanf("%d", s + i);
    			update(s[i], 1);
    		}
    
    		int ans = (s[1] + s[2]) ^ s[3];
    		for(int i = 1; i < n; i++) {
    			update(s[i], -1);
    			for(int j = i + 1; j <= n; j++) {
    				update(s[j], -1);
    				int t = match(s[i] + s[j]);
    				ans = max(ans, t);
    				update(s[j], 1);
    			}
    			update(s[i], 1);
    		}
    
    		printf("%d
    ", ans);
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    Mininet学习指南
    Docker and OverlayFS in practice
    (OK) dnf——install docker on Fedora23
    Running Docker Swarm inside LXC
    ERROR——running docker in CORE on Fedora23
    (OK) dnf
    (OK) simply running CORE & docker on Fedora 23
    北京大学互联网信息工程研发中心(深圳)
    nload
    (OK) CORE
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4929055.html
Copyright © 2011-2022 走看看