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 ",S::que(x,rt),que1(x),que2(x)); 92 } 93 else 94 { 95 printf("%d ",S::que(x,rt)); 96 } 97 } 98 return 0; 99 }