106 最大异或对
视频链接:
#includeusing namespace std; const int N = 100010; int n; int a[N]; // ch[p][e]: p父节点, e边, ch子节点 int ch[N*31][2], idx; void insert(int x){ // 建树 int p = 0; for(int i = 30; i >= 0; i --){ int e = x>>i&1; //取出第i位 if(!ch[p][e])ch[p][e] = ++idx; p = ch[p][e]; } } int query(int x){ // 求异或值 int p = 0, res = 0; for(int i = 30; i >= 0; i --){ int e = x>>i&1; if(ch[p][!e]){ res += 1<//累加位权值 p = ch[p][!e]; } else p = ch[p][e]; } return res; } int main(){ cin >> n; for(int i = 1; i <= n; i ++) cin >> a[i], insert(a[i]); int ans = 0; for(int i = 1; i <= n; i ++) ans=max(ans,query(a[i])); cout << ans; return 0; }