标签:查询 结构 res 循环 结束 字符 异或运算 子节点 trie
void insert(char s[]) {
int p = 0;
for(int i = 0; s[i]; i++){
int u = s[i] - ‘a‘;
if(!sons[p][u]) sons[p][u] = ++idx;
p = sons[p][u];
}
++cnt[p]; // 记录以该点结束的单词的个数
}
int query(char s[]) {
int p = 0;
for(int i = 0; s[i]; i++) {
int u = s[i] - ‘a‘;
if(!sons[p][u]) return 0;
p = sons[p][u];
}
return cnt[p];
}
在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得出最大结果
void solve() {
for(int i = 0; i < n; i++)
for(int j = 0; j < i; j++)
res = max(res, a[i] ^ a[j]);
return res;
}
const int N = 1e5 + 10, M = 31 * N;
int n, x;
int son[M][2], idx;
void insert(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];
}
}
int query(int x) {
int p = 0, res = 0;
for(int i = 30; i >= 0; i--) {
int u = x >> i & 1;
if(son[p][!u]) {
p = son[p][!u];
res = res * 2 + !u;
}
else {
p = son[p][u];
res = res * 2 + u;
}
}
return res;
}
int solve(int n) {
int res = 0;
for(int i = 0; i < n; i++) {
int x; scanf("%d", &x);
insert(x);
res = max(res, query(x));
}
return res;
}
标签:查询 结构 res 循环 结束 字符 异或运算 子节点 trie
原文地址:https://www.cnblogs.com/Hot-machine/p/13192023.html