01tire算法
![](https://i-blog.csdnimg.cn/blog_migrate/2a988e49e4a8cfd5dc5c2ddeaeea849b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4c0d928ec8ef148b397d0e713a1412a2.png)
#include<bits/stdc++.h>
using namespace std;
#define maxn 210000
int a[maxn], ch[maxn][2], val[maxn], n, ans, tot;
void insert(int x)
{
int now = 0;
for (int j = 31; j >= 0; j -- )
{
int pos = ((x >> i) & 1);
if (!ch[now][pos])
ch[now][pos] = ++ tot;
now = ch[now][pos];
}
val[now] = x;
return ;
}
int query(int x)
{
int now = 0;
for (int j = 31; j >= 0; -- j )
{
int pos = ((x >> j) & 1);
if (ch[now][pos ^ 1])
now = ch[now][pos ^ 1];
else
now = ch[now][pos];
}
return val[now];
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i )
{
int x;
scanf("%d", &x);
insert(x);
}
for (int i = 1; i <= n; ++ i )
{
ans = max(ans, query(a[i]));
}
cout << ans << endl;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/2d6cbd7f52855ff20bfb3d31dfa6564c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0116eb10fa538bf6960d7029f8936573.png)