字典树

字典树

1、用途:用于处理一些字符串匹配,或任意两数异或最大值,等等...

1、模版:洛谷P8306

template<typename T>
struct Z_tree{
	int n, tot;
	vector<T> cnt;
	vector<array<int, 2>> tree;
	
	Z_tree(int n_) : cnt(n_ << 5), tree(n_ << 5) {
        n = n_;
        tot = 0; 
    }
	
	inline void insert(int x) {
		int p = 0;
		for (int i = 30; i >= 0; i--) {
			int u = x >> i & 1;
			if (!tree[p][u]) {
                tree[p][u] = ++tot;
            }
            p = tree[p][u];
            cnt[p]++;
		}
	}
	
	inline int find(int x) {
		int p = 0;
		int res = 0;
		for (int i = 30; i >= 0; i--) {
			int u = x >> i & 1;
			if (tree[p][u ^ 1]) {
                res += (1 << i);
                p = tree[p][u ^ 1];
            } else {
                p = tree[p][u];
            }
		}
		
		return res;
	}
};

3、稍微进阶题(个人认为比较有意思):CF

posted @ 2024-08-15 02:10  grape_king  阅读(17)  评论(0)    收藏  举报