【求助】有关trie树中节点编号初始值的一个疑问
查看原帖
【求助】有关trie树中节点编号初始值的一个疑问
292204
k1844118002楼主2021/11/10 21:25
#include <bits/stdc++.h>

using namespace std;

const int N = 2e6+5;

struct TrieTree {
	int idx;
	int tr[N][2], cnt[N];	
	
	void init() {
		idx = 1;
		tr[0][0] = tr[0][1] = 0;
		memset(cnt, 0, sizeof cnt);
	} 
	
	void insert(int x, int v) {
		int p = 1;
		for (int i = 31; i >= 0; i--) {
			int u = x>>i&1;
			if (!tr[p][u]) {
				tr[p][u] = ++idx;
				tr[idx][0] = tr[idx][1] = 0;
			}
			p = tr[p][u];
			cnt[p] += v;		
		}	
	}
	
	int query(int x, int y) {
		int res = 0, p = 1;
		for (int i = 31; i >= 0; i--) {
			int u1 = x>>i&1, u2 = y>>i&1;
			if (u1) {
				if (u2) {
					res += cnt[tr[p][1]];
					p = tr[p][0];
				} else {
					p = tr[p][1];
				}
			} else {
				if (u2) {
					res += cnt[tr[p][0]];
					p = tr[p][1];
				} else {
					p = tr[p][0];
				}
			}
		}
		return res;
	}
}tree;

signed main() {
	tree.init();
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int op;
		scanf("%d", &op);
		if (op == 1) {
			int x;
			scanf("%d", &x);
			tree.insert(x, 1);
		} else if (op == 2) {
			int x;
			scanf("%d", &x);
			tree.insert(x, -1);
		} else if (op == 3) {
			int x, y;
			scanf("%d%d", &x, &y);
			cout << tree.query(x, y) << '\n';
		}
	}
	return 0;
} 

比如对于这道题的这份代码,如果将idx和p的值从0开始就会wa掉,但是从1开始就可以ac

2021/11/10 21:25
加载中...