最大xor,and,or

http://210.33.19.103/contest/998

and,or部分 并不用01trie,题目&题解:https://blog.csdn.net/dreaming__ldx/article/details/81909133

(奇怪的方法,然而至今没搞明白:https://blog.csdn.net/izumi_hanako/article/details/79317653

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 typedef pair<int,int> pii;
13 namespace S
14 {
15 const int N=20000000;
16 int ch[N][2],mem,sz[N];
17 int gnode()
18 {
19     int t=++mem;ch[t][0]=ch[t][1]=0;sz[t]=0;
20     return t;
21 }
22 const int dep=19;
23 void ins(int x,int &num)
24 {
25     if(!num)    num=gnode();
26     sz[num]++;
27     bool d;int i,p=num;
28     for(i=dep;i>=0;i--)
29     {
30         d=x&(1<<i);
31         if(!ch[p][d])   ch[p][d]=gnode();
32         p=ch[p][d];sz[p]++;
33     }
34 }
35 int que(int x,int p)
36 {
37     bool d;int i,an=0;
38     for(i=dep;i>=0;i--)
39     {
40         d=!(x&(1<<i));
41         if(!sz[ch[p][d]])   d=!d;
42         p=ch[p][d];
43         if(d)   an|=(1<<i);
44     }
45     return an^x;
46 }
47 }
48 bool vis[2001000];
49 int q;
50 int rt;
51 void ins(int x)
52 {
53     if(vis[x])  return;
54     vis[x]=1;
55     for(int i=0;i<=19;i++)
56         if(x&(1<<i))
57             ins(x^(1<<i));
58 }
59 int que1(int x)//and
60 {
61     int i,an=0;
62     for(i=19;i>=0;i--)
63         if((x&(1<<i))&&vis[an|(1<<i)])
64             an|=(1<<i);
65     return an;
66 }
67 int que2(int x)//or
68 {
69     int i,an=0,d=0;
70     for(i=19;i>=0;i--)
71         if(x&(1<<i))
72             an|=(1<<i);
73         else if(vis[d|(1<<i)])
74             an|=(1<<i),d|=(1<<i);
75     return an;
76 }
77 int main()
78 {
79     int tp,x;
80     scanf("%d",&q);
81     while(q--)
82     {
83         scanf("%d%d",&tp,&x);
84         if(tp==1)
85         {
86             S::ins(x,rt);
87             ins(x);
88         }
89         else if(tp==2)
90         {
91             printf("%d %d %d\n",S::que(x,rt),que1(x),que2(x));
92         }
93         else
94         {
95             printf("%d\n",S::que(x,rt));
96         }
97     }
98     return 0;
99 }
View Code

 

posted @ 2018-09-17 21:58  hehe_54321  阅读(244)  评论(0编辑  收藏  举报
AmazingCounters.com