zoukankan      html  css  js  c++  java
  • Xor Sum HDU

    #include<bits/stdc++.h>
    //#pragma comment(linker, "/STACK:1024000000,1024000000") 
    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    #include<set>
    #include<map>
    #include<vector>
    #include<iomanip>
    using namespace std;
    #define ll long long
    #define pb push_back
    #define FOR(a) for(int i=1;i<=a;i++)
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+9;  
    const int maxnode=32*maxn;
    
    int ch[maxnode][2];
    int val[maxnode];
    int sz;
    void init(){memset(ch[0],0,sizeof ch[0]);sz=1;}
    
    void insert(int num){
    	int now=0;
    	for(int i=30;i>=0;i--){
    		int c=(num>>i)&1;
    		if(!ch[now][c]){
    			memset(ch[sz],0,sizeof ch[sz]);
    			val[sz]=0;
    			ch[now][c]=sz++;
    		}
    		now=ch[now][c];
    	}
    	val[now]=num;
    }
    
    int query(int num){
    	int now=0;
    	for(int i=30;i>=0;i--){
    		int c=(num>>i)&1;
    		if(ch[now][c^1])now=ch[now][c^1];
    		else now=ch[now][c];
    	}
    	return val[now];
    }
    
    int T,n,q;
    int main(){
    	int kase=0;
    	scanf("%d",&T);
    	while(T--){
    		init();
    		scanf("%d%d",&n,&q);
    		for(int i=1;i<=n;i++){
    			int x;
    			scanf("%d",&x);
    			insert(x);
    		}
    		printf("Case #%d:
    ",++kase);
    		for(int i=1,x;i<=q;i++){
    			scanf("%d",&x);
    			printf("%d
    ",query(x));
    		}
    	}
    }

    这题还挺直观的。。

    要注意的是int正数只需要32个二进制格子(这啥,所以右移30次就遍历到最高位了

  • 相关阅读:
    mysql数据库__Jdbc直接操作__PreparedStatement__新增数据库
    GeneralUtils
    java easyExcel框架
    java8 stream流操作
    Java解析json报文案列
    如何避免空指针?
    List、Map集合的遍历方式
    java---关于多态性
    Android环境的搭建
    css+div学习
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611290.html
Copyright © 2011-2022 走看看