字典树 hdu-4825 Xor Sum 为例

版权声明:本博客内容基本为原创,如有问题欢迎联系,转载请注明出处 https://blog.csdn.net/qq_41955236/article/details/84953743

题目链接不发了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100005;
int trie[maxn*30][2],tot,consi[35];
void Insert(){
    int rt=0;
    for(int i=1;i<=32;i++){
        int now=consi[i];
        if(!trie[rt][now]) trie[rt][now]=++tot;
        rt=trie[rt][now];
    }
}
void deal(int x){
    int num=32;
    while(num){
        if(x&1) consi[num]=1;
        else consi[num]=0;
        num--; x/=2;
    }
}
ll Search(){
    ll ans=0; int rt=0;
    for(int i=1;i<=32;i++){
        int a=consi[i]; a^=1;
        int wei=32-i;
        if(trie[rt][a]){
            if(a==1) ans=ans+(1<<wei);
            rt=trie[rt][a];
        }
        else {
            if(a==0) ans=ans+(1<<wei);
            a^=1;
            rt=trie[rt][a];
        }
    }
    return ans;
}
int main(){
    int t,cas=0,n,q,x;
    cin>>t;
    while(t--){
        memset(trie,0,sizeof(trie)); tot=0;
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            deal(x);
            Insert();
        }
        printf("Case #%d:\n",++cas);
        while(q--){
            scanf("%d",&x);
            deal(x);
            printf("%lld\n",Search());
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41955236/article/details/84953743