【字典树】【贪心】Codeforces 706D Vasiliy's Multiset

来源:互联网 发布:win10 php环境搭建 编辑:程序博客网 时间:2024/05/17 02:46
题目链接:

  http://codeforces.com/contest/706/problem/D

题目大意

  三种操作,1.添加一个数,2.删除一个数,3.查询现有数中与x异或最大值。(可重复)

题目思路:

  【字典树】【贪心】

  维护一个字典树,左0右1。查询时从上往下走。

 

////by coolxxx//#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define mem(a,b) memset(a,b,sizeof(a))#define eps (1e-8)#define J 10000000#define MAX 0x7f7f7f7f#define PI 3.1415926535897#define N 5000004using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;int t[N];int ch[N][2];char c[1];void add(int x){int i,j,k=1;for(i=30;i>=0;i--){j=((1<<i)&x)>0;if(!ch[k][j])ch[k][j]=++lll;k=ch[k][j];t[k]++;}}void del(int x){int i,j,k=1;for(i=30;i>=0;i--){j=((1<<i)&x)>0;k=ch[k][j];t[k]--;}}int find(int x){int i,j,k=1;ans=0;for(i=30;i>=0;i--){j=((1<<i)&x)==0;if(t[ch[k][j]]){ans|=(1<<i);k=ch[k][j];}else k=ch[k][1-j];}return ans;}int main(){#ifndef ONLINE_JUDGE//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j,x;//for(scanf("%d",&cas);cas;cas--)//for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s))while(~scanf("%d",&n)){mem(ch,0);mem(t,0);lll=1;add(0);for(i=1;i<=n;i++){scanf("%s%d",c,&x);if(c[0]=='+')add(x);else if(c[0]=='-')del(x);else printf("%d\n",find(x));}}return 0;}/*////*/


0 0
原创粉丝点击