Perfect Security

Perfect Security

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

分析

由于我们需要得到字典序最小的生成序列
所以我们考虑贪心
对可以随机选取的数组进行构造01Trie
进而我们遍历数组A[]
每次贪心往小的点走
找到之后我们删除它
那么我们再写一个Delete()函数即可
时间复杂度:

代码

//CF923C
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(int i=A;i<=B;i++)
#define BOR(i,A,B) for(int i=A;i>=B;i--)
#define Debug(X) cerr<<#X<<" = "<<X<<" "
#define Lowbit(X) (X & (-X))
#define Skip cout<<endl;
#define INF 0x3f3f3f3f
#define Mod 998244353
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;


using namespace std;

const int N=3e5+3;
const int md=1e9+7;
const int inf=1e9+3;

int n,nm,res;
int a[N];
int b[N];
int to[N*30][2];
int sm[N*30];

inline void Update(int x) {
    int v=1;
    BOR(i,29,0) {
        int z=0;
        if(x&(1<<i)) z=1;
        sm[v]++;
        if(to[v][z]==0)to[v][z]=++nm;
        v=to[v][z];
    }
    sm[v]++;
}

inline void Delete(int x) {
    int v=1;
    res=0;
    BOR(i,29,0) {
        int z=0;
        if(x&(1<<i)) z=1;
        sm[v]--;
        if(sm[to[v][z]]==0)res|=(1<<i),z^=1;
        v=to[v][z];
    }
    sm[v]--;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    nm=1;
    cin>>n;
    FOR(i,1,n) cin>>a[i];
    FOR(i,1,n) { cin>>b[i]; Update(b[i]); }
    FOR(i,1,n) { Delete(a[i]); cout<<res<<" "; }
    cout<<endl;
    system("pause");
    return 0;
}
全部评论

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务