算法基础之最大异或对

最大异或对

  • 核心思想:数组模拟Trie 实现

    • 因为每个位置100000的数据 总共31位 所以M取到3100000

    •   #include
        #include
        
        using namespace std;
        
        const int N=100010,M=3000010;
        
        int n;
        int a[N],son[M][2],idx;
        
        void insert(int x){
            int p=0;
            for(int i=30;i>=0;i--){
                //用引用 因为需要修改son[p][x>>i&1]的值
                int &s = son[p][x>>i &1];
                if(!s) s=++idx;
                p = s;
            }
        }
        
        int query(int x){
            int p=0,res=0;
            for(int i=30;i>=0;i--){
                //记录第i位是0还是1
                int s = x>>i&1;
                if(son[p][!s]) {
                    res+=1<<i;  //从最高位开始找 找到右移i位存起来 直到凑出一个完整的数
                    p = son[p][!s];  //有就找反的
                }
                else p = son[p][s];  //没有就找一样的
            }
            return res;
        }
        int main(){
            cin>>n;
            for(int i=0;i<n;i++){
                cin>>a[i];
                insert(a[i]);
            }
            
            int res=0;
            for(int i=0;i<n;i++) res = max(res,query(a[i]));
            printf("%d", res);
            return 0;
        }
      

你可能感兴趣的:(算法,c++,数据结构)