mooyyu

D4 - 字典树

c++11 DS

Examples

单词计数
class trietree {
	int ar[maxn + 1][26] {};
	int cnt[maxn + 1] {};
	int idx = 1;
public:
	void insert(string &s) {
		static int cur;
		cur = 0;
		for (int c : s) {
			c -= 'a';
			if (!ar[cur][c]) ar[cur][c] = idx++;
			cur = ar[cur][c];
		}
		++cnt[cur];
	}
	int query(string &s) {
		static int cur;
		cur = 0;
		for (int c : s) {
			c -= 'a';
			if (!ar[cur][c]) return 0;
			cur = ar[cur][c];
		}
		return cnt[cur];
	}
} trie;
最大抑或树
int ar[maxlen];

class trietree {
	int ar[maxn][2] {};
	int idx = 1;
public:
	void insert(int x) {
		for (int i = 30, u, cur = 0; i >= 0; --i) {
			u = (x >> i) & 1u;
			if (!ar[cur][u]) ar[cur][u] = idx++;
			cur = ar[cur][u];
		}
	}
	int query(int x) {
		int ret = 0;
		for (int i = 30, u, cur = 0; i >= 0; --i) {
			u = 1 - ((x >> i) & 1u);
			if (ar[cur][u]) cur = ar[cur][u], ret |= 1u << i;
			else cur = ar[cur][1 - u];
		}
		return ret;
	}
} trie;

Usage

int n;
cin >> n;
for (int i = 0; i < n; i++) {
  cin >> ar[i];
  trie.insert(ar[i]);
}
int ret = 0;
for (int i = 0; i < n; i++) ret = max(ret, trie.query(ar[i]));
printf("%d\n", ret);