Vitya and Strange Lesson

Vitya and Strange Lesson

https://ac.nowcoder.com/acm/problem/112209

要求个数和异或后,没有出现的最小数字

那么这个数异或后的值是没有用的,因为都出现过

所以我们把所有不是这个数的数插入字典树

这样这些数异或后一定是没有出现的数字

这样贪心找最小值即可

还有一个小技巧,因为

所以不需要真的改变数组的值,只需要把操作数异或起来就可以

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=6e6+10;
int n,m,zi[maxn][3],id,isok[maxn];
bool ok[maxn];
void insert(int x)
{
    int now=0;
    for(int i=30;i>=0;i--)
    {
        int w = ((x>>i)&1);
        if( !zi[now][w] )    zi[now][w]=++id;
        now = zi[now][w];
    }
    isok[now]=x;
}
int ask(int x)
{
    int ans=0,now=0;
    for(int i=30;i>=0;i--)
    {
        int w = ((x>>i)&1);
        if( zi[now][w] )    now = zi[now][w];
        else    now = zi[now][w^1],ans+=(1<<i);
    }
    return ans;
}
signed main()
{
    cin >> n >> m;
    int maxx=0;
    for(int i=1;i<=n;i++)
    {
        int x; scanf("%lld",&x);
        ok[x]=1;    maxx = max( maxx,x );
    }
    maxx = (maxx+1)*2;
    for(int i=0;i<=maxx;i++)
        if( !ok[i] )    insert(i);
    int pre=0;
    for(int i=1;i<=m;i++)
    {
        int x; scanf("%lld",&x);
        pre^=x;
        printf("%lld\n",ask(pre)); 
    }
}
全部评论

相关推荐

评论
3
收藏
分享
牛客网
牛客企业服务