2020 蓝桥杯大学 A 组模拟赛(三) 程序设计:小明的赈灾计划 trie树

由于题目比较简单,今天双开,打了3月普及组模拟赛和这个,然后状态也不好,一个第三名一个第15名,发挥失常

题目链接

这个链接好像只能报了名的进去?

前面的题都很简单,但也要注意代码别写错,直接怼最后一个题:

J-程序设计:小明的赈灾计划

考虑前缀异或后  就成功的将题转化为给你n个数,要求两两异或的最大值,字典树的经典操作了,对二进制进行拆分建树,然后求最大值时在树上 跑与当前位 相反的一位就可以了(从高到低位跑)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,pre[N],a[N],ans;
int tr[N*32][2],tot;
void in(int x)
{
    int u=0;
    for(int i=30;i>=0;--i){
        if(!tr[u][(x>>i)&1]) tr[u][(x>>i)&1]=++tot;
        u=tr[u][(x>>i)&1];
    }
}
int qu(int x)
{
    int ans=0,u=0;
    for(int i=30;i>=0;--i){
        if(tr[u][(x>>i)&1^1]){
            ans+=1<<i;
            u=tr[u][((x>>i)&1)^1];
        }
        else u=tr[u][(x>>i)&1];
    }
    return ans;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        pre[i]=pre[i-1]^a[i];
        ans=max(ans,pre[i]);
    }
    in(a[1]);
    for(int i=2;i<=n;++i){
        ans=max(ans,qu(pre[i]));
        in(pre[i]);
    }
    printf("%d\n",ans);
}
发布了498 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/104868002
今日推荐