classSolution { public: // 用二维 vector 模拟 Trie 树 vector<vector<int>> s; // s[当前节点编号][当前节点第几个孩子] = 孩子节点编号,「当前节点第几个孩子」里面蕴含了信息,本题有两个孩子,0 和 1 代表这一位是 0 还是 1 voidinsert(int x){ int p = 0; for (int i = 30; i >= 0; i--) { // 取出当前位 int u = x >> i & 1; // 如果这一位不在 Trie 里,new 一个节点,然后让当前节点指向它 if (!s[p][u]) s[p][u] = s.size(), s.push_back({0, 0}); p = s[p][u]; } } intquery(int x){ int p = 0; int res = 0; for (int i = 30; i >= 0; i--) { int u = x >> i & 1; // 尽量选择与当前数这一位相反的路径 if (s[p][!u]) p = s[p][!u], res = res * 2 + !u; else p = s[p][u], res = res * 2 + u; } return res ^ x; } intfindMaximumXOR(vector<int>& nums){ s.push_back({0, 0}); int res = 0; for (auto x : nums) { res = max(res, query(x)); insert(x); } return res; } };