想问一下为啥
  • 板块CF1446C Xor Tree
  • 楼主zMinYu
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/11/13 17:38
  • 上次更新2024/4/6 14:22:17
查看原帖
想问一下为啥
882092
zMinYu楼主2023/11/13 17:38

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 应该是会有影响的啊(主要是之前打的忘注释了)。

2023/11/13 17:38
加载中...