前几天做了个Trie树的题,正好记一下。
首先先看一个简单题
AcWing 143. 最大异或对
题目
在给定的N个整数A1,A2……AN中选出两个进行 xor(异或)运算,得到的结果最大是多少?
第一行输入一个整数N。
第二行输入N个整数A1~AN。
输出一个整数表示答案。
1 ≤ N ≤ 1 0 5 , 0 ≤ A i < 2 3 1 1≤N≤10^5, 0≤A_i<2^31 1≤N≤105,0≤Ai<231
Solution
这个题看数据范围应该是O(nlogn)级别内的,先看暴力做法就是枚举Ai和Aj,这样是O(n^2)的,妥妥的TLE。然后看第一维Ai肯定要保留,只有优化第二维Aj了。
要求两个数异或最大,肯定要越高位越大越好,根据这个贪心的思想,就可以套上Trie了(生硬)。
这里的son数组:son[s][0/1]表示s层0/1结点的子结点在son数组中的下标。
/**
* AcWing 143. 最大异或对
* https://www.acwing.com/problem/content/145/
*/
#include <iostream>
using namespace std;
const int N = 100010, M = 3000000;
int n, a[N];
int son[M][2], idx;
void insert(int x)
{
int p =