diff --git a/Hydro/H1002/H1002.cpp b/Hydro/H1002/H1002.cpp new file mode 100644 index 00000000..3dd31c84 --- /dev/null +++ b/Hydro/H1002/H1002.cpp @@ -0,0 +1,55 @@ +#include + +using namespace std; + +int n, a[1000005], ans; + +struct node { + int val; + node* next[2]; + + ~node() { + for (auto i : next) { + delete i; + } + } +}; + +void insert(node* root, int x, int b) { + if (!x) { + root->val++; + return; + } + if (root->next[(x >> b) & 1] == nullptr) root->next[(x >> b) & 1] = new node(); + insert(root->next[(x >> b) & 1], x - (((x >> b) & 1) << b), b - 1); +} + +int search(node* root, int x) { + int res = 0; + node* p = root; + for (int i = 30; i >= 0; i--) { + if (p == nullptr) break; + if (p->next[!((x >> i) & 1)] != nullptr) { + res += 1 << i; + p = p->next[!((x >> i) & 1)]; + } else { + p = p->next[(x >> i) & 1]; + } + } + return res; +} + +int main() { + node* root = new node(); + scanf("%d", &n); + for (int i = 0; i < n; i++) { + scanf("%d", a + i); + insert(root, a[i], 30); + } + for (int i = 0; i < n; i++) { + ans = max(ans, search(root, a[i])); + } + printf("%d\n", ans); + delete root; + return 0; +}