Code1:
#include <bits/stdc++.h>
using namespace std;
const int N = 200000 * 32 + 5;
struct Trie {
int son[2], ed;
// int soncnt[2];
};
Trie tr[N];
int n, a[N], idx = 0;
void add(int xx) {
int u = 0;
for (int i = 30; i >= 0; i--) {
int x = xx >> i;
if (!tr[u].son[x % 2]) {
tr[u].son[x % 2] = ++idx;
}
// tr[u].soncnt[x % 2]++;
u = tr[u].son[x % 2];
// x >>= 1;
}
tr[u].ed = 1;
return;
}
int solve(int u) {
if (tr[u].son[0] && tr[u].son[1]) return max(solve(tr[u].son[0]), solve(tr[u].son[1])) + 1;
if (!tr[u].son[0] && !tr[u].son[1]) return 1;
if (!tr[u].son[0]) return solve(tr[u].son[1]);
if (!tr[u].son[1]) return solve(tr[u].son[0]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
add(a[i]);
}
cout << n - solve(0);
return 0;
}
Code2:
#include <bits/stdc++.h>
using namespace std;
const int N = 200000 * 32 + 5;
struct Trie {
int son[2], ed;
// int soncnt[2];
};
Trie tr[N];
int n, a[N], idx = 0;
void add(int xx) {
int u = 0;
for (int i = 30; i >= 0; i--) {
int x = xx >> i;
if (!tr[u].son[x % 2]) {
tr[u].son[x % 2] = ++idx;
}
// tr[u].soncnt[x % 2]++;
u = tr[u].son[x % 2];
x >>= 1;
}
tr[u].ed = 1;
return;
}
int solve(int u) {
if (tr[u].son[0] && tr[u].son[1]) return max(solve(tr[u].son[0]), solve(tr[u].son[1])) + 1;
if (!tr[u].son[0] && !tr[u].son[1]) return 1;
if (!tr[u].son[0]) return solve(tr[u].son[1]);
if (!tr[u].son[1]) return solve(tr[u].son[0]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
add(a[i]);
}
cout << n - solve(0);
return 0;
}
这俩都能 AC,只有 x >>= 1 一行之差,按理来说,Code1 是对的。
但是加了 x >>= 1 应该是会有影响的啊(主要是之前打的忘注释了)。