1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| #include <cstdio> #include <cstring> #include <cmath> #include <set> #include <queue> #include <map> #include <set> #include <string> #include <iostream> #include <iomanip> #include <stack> #define rep(i,a,n) for(int i=a ; i<n;++i) #define per(i,a,n) for(int i=n-1;i>=a;--i) #define fi first #define se second #define cl(x,a) memset(x,a,sizeof(x)) #define all(x) x.begin(),x.end() #define insert(x) x,x.begin() #define debug printf("======================\n"); #define mp make_pair #define np next_permutation #define pb push_back #define INF 0x3f3f3f3f #define eps 1e-8 using namespace std; const int maxn=1e5+5; const int maxm=1e5+5; const int maxl=2; const int K=32;
typedef long long ll; typedef struct Trie{ int v; Trie* next[maxl]; }Trie;
Trie *root;
void iniTrie(){ root=(Trie*) malloc(sizeof(Trie)); rep(i,0,maxl) root->next[i]=NULL; root->v=-1; }
bool creTrie(int a){ int temp[35]; int id=K-1; while(a){ temp[id--]=(a&1); a>>=1; } rep(i,0,id+1) temp[i]=0; int l=K; Trie *p=root,*q; rep(i,0,l){ int id=temp[i]; if(p->next[id]!=NULL){ p=p->next[id]; } else { q=(Trie*) malloc(sizeof(Trie)); q->v=1; for(int j=0;j<maxl;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } } }
int findTrie(int a){ int aa=a; int temp[35]; int id=K-1; while(a){ temp[id--]=(a&1); a>>=1; } rep(i,0,id+1) temp[i]=0; int aans=0; Trie *p=root; int l=K; for(int i=0;i<l;i++){ int index= !temp[i]; if(p->next[index] !=NULL ){ aans=(aans<<1)+index; p=p->next[index]; } else { aans=(aans<<1)+temp[i]; p=p->next[temp[i]]; } } return aans^aa; }
void delTrie(Trie *p){ int i; for(int i=0;i<maxl;i++){ if(p->next[i]!= NULL) delTrie(p->next[i]); } free(p); p=NULL; return ; }
int a[maxn],n,m;
int main(){ ios::sync_with_stdio(false); while(cin>>n>>m){ iniTrie(); rep(i,0,n){ cin>>a[i]; creTrie(a[i]); } int fans=0; rep(i,0,n){ fans=max(fans,findTrie(a[i])); } if(fans>m) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
|