three arrays

three arrays

字典树上贪心

#include<bits/stdc++.h>
using namespace std;
int trie[3000005][2][2];
int siz[3000004][2];
int A[31];
int tot[2];
bool ed[3000005][2];
int val[3000004][2];
int N;
void init()
{
    tot[0]=tot[1]=1;
    for(int i=0; i<=30*N; i++)
    {
        val[i][0]=val[i][1]=0;
        ed[i][0]=ed[i][1]=0;
        trie[i][1][1]=trie[i][0][1]=trie[i][0][0]=trie[i][1][0]=0;
        siz[i][1]=siz[i][0]=0;
    }

}
void insert(int x,bool f)
{
    int k=0;
    int y=x;
    while(x)
    {
        A[k++]=x%2;
        x/=2;
    }
    while(k<31)A[k++]=0;
    int t=1;
    int j=30;
    int len=0;
    while(j>=0)
    {
        ++siz[t][f];
        if(trie[t][A[j]][f]==0)
        {
            trie[t][A[j]][f]=++tot[f];
        }
        t=trie[t][A[j]][f];

        j--;
      //  cout<<t<<"t"<<endl;
        len++;
    }
    //cout<<len<<" leN
";
    ++siz[t][f];
    ed[t][f]=1;
    val[t][f]=y;
    //cout<<t<<'
';

}
int query()
{
    int t0=1,t1=1;
    int len=0;
    while(!ed[t0][0]&&!ed[t1][1])
    {
        --siz[t0][0];
        --siz[t1][1];
       // cout<<t0<<t1<<endl;//siz[t0][0]<<siz[t1][1]<<endl;
        if(siz[trie[t0][0][0]][0]&&siz[trie[t1][0][1]][1])
        {
            t0=trie[t0][0][0];
            t1=trie[t1][0][1];
        }
        else if(siz[trie[t0][1][0]][0]&&siz[trie[t1][1][1]][1])
        {
            t0=trie[t0][1][0];
            t1=trie[t1][1][1];
        }
        else
        {
            if(siz[trie[t0][1][0]][0])
                t0=trie[t0][1][0];
            else t0=trie[t0][0][0];
            if(siz[trie[t1][1][1]][1])
                t1=trie[t1][1][1];
            else t1=trie[t1][0][1];

        }
      //  ++len;
    }
    //cout<<len<<"LEN"<<'
';
    siz[t0][0]--;
    siz[t1][1]--;
    //cout<<t0<<t1<<'
';
   //cout<<ed[t0][0]<<' '<<ed[t1][1]<<'
';
    return val[t0][0]^val[t1][1];
}
int T;
int a,b;
int C[100005];
int main()
{
    //freopen("1.in","r",stdin);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        init();
        for(int i=0; i<N; i++)
        {
            scanf("%d",&a);
            insert(a,0);
        }
        for(int i=0; i<N; i++)
        {
            scanf("%d",&b);
            insert(b,1);
        }
        for(int i=0;i<N;i++){
            C[i]=query();
        }
        sort(C,C+N);
        for(int i=0; i<N; i++)
        {
            cout<<C[i]<<((i!=N-1)?' ':'
');
        }
    }

}
原文地址:https://www.cnblogs.com/liulex/p/11314613.html