int son[N][26], cnt[N], idx; // 0号点既是根节点,又是空节点 // son[][]存储树中每个节点的子节点 // cnt[]存储以每个节点结尾的单词数量
// 插入一个字符串 voidinsert(char *str) { int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!son[p][u]) son[p][u] = ++ idx; p = son[p][u]; } cnt[p] ++ ; }
// 查询字符串出现的次数 intquery(char *str) { int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!son[p][u]) return0; p = son[p][u]; } return cnt[p]; }
题目描述:
在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?
int n; int a[N], son[M][2], idx; //M代表一个数字串二进制可以到多长
voidinsert(int x){ int p = 0; //根节点 for(int i = 30; i >= 0; i--){ int &s = son[p][x >> i & 1]; //取X的第i位的二进制数是什么 x>>k&1(前面的模板) if(!s) s = ++ idx; //创建节点 p = s; } }
intsearch(int x){ int p = 0, res = 0; for(int i = 30; i >= 0; i--){ //从最大位开始找 int s = x >> i & 1; if(son[p][!s]){ //如果当前层有对应的不相同的数 res += 1 << i; p = son[p][!s]; } else p = son[p][s]; } return res; }
intmain() { scanf("%d",&n); for(int i = 0; i < n; i++){ scanf("%d",&a[i]); insert(a[i]); } int res = 0; for(int i = 0; i < n; i++) res = max(res,search(a[i])); printf("%d\n",res); return0; }
#include<stdio.h> #define N 100010 #define M 3100010 #define max(x,y) ((x)>(y)?(x):(y))
int n; int a[N], son[M][2], idx;
voidinsert(int x){ int p = 0; for(int i = 30; i >= 0; i--){ int u = x >> i & 1; if(!son[p][u]) son[p][u] = ++idx; p = son[p][u]; } }
intsearch(int x) { int p = 0, res = 0; for (int i = 30; i >= 0; i -- ) { int s = x >> i & 1; if (son[p][!s]) { res += 1 << i; p = son[p][!s]; } else p = son[p][s]; } return res; }
intmain() { scanf("%d", &n); for (int i = 0; i < n; i ++ ) { scanf("%d", &a[i]); insert(a[i]); }
int res = 0; for (int i = 0; i < n; i ++ ) res = max(res, search(a[i]));