题目链接:http://#10050. 「一本通 2.3 例 2」The XOR Largest Pair
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 31 * N;
int a[N];
int son[M][2],idx;//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])//二进制第i位不同
{
p = son[p][!u];
res = res * 2 + !u;
}
else//相同
{
p = son[p][u];
res = res * 2 + u;
}
}
return res;
}
int main()
{
int res=0,n;
cin>>n;
for(int i = 0; i < n; i ++)
{
scanf("%d", &a[i]);
insert(a[i]);
int t = query(a[i]);
res = max(res, a[i] ^ t);
}
printf("%d\n", res);
return 0;
}
#include <stdio.h>
#include <string.h>
int a[123224][3];
int book[1234];
int cnt;
int insert(char x[])
{
int i, lx = strlen(x);
int f = 0, id = 1;
for (i = 0; i < lx; i++)
{
int xx = x[i] - '0';
if (a[id][xx] == 0) a[id][xx] = ++cnt;
else if (i==lx-1) f = 1;//x[]为另一字符串的子串
if (book[id]) f=1;//另一字符串为x[]的字串
id = a[id][xx];
}
book[id] = 1;
return f;
}
int main()
{
char x[12];
int f = 0;
int q = 0;
cnt = 1;
memset(book, 0, sizeof(book));
while (~scanf("%s", &x))
{
int l = strlen(x);
if (l == 1 && x[0] == '9')
{
q++;
if(!f) printf("Set %d is immediately decodable\n", q);
else printf("Set %d is not immediately decodable\n", q);
f = 0;
cnt = 1;
memset(book, 0, sizeof(book));
memset(a, 0, sizeof(a));
}
else if (insert(x))
f = 1;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+7;
int tree[N][2],a[N];
int sum[N],size[N],cnt;
void insert(int k)
{
int p=0;
for(int i=1; i<=k; p=tree[p][a[i]],++i)
{
if(!tree[p][a[i]]) tree[p][a[i]]=++cnt;
size[p]++;
}
sum[p]++;
size[p]++;
}
void quiry(int k)
{
int ans=0,p=0;
for(int i=1; i<=k; p=tree[p][a[i]],++i)
{
if(!tree[p][a[i]]) break;
if(i!=k) ans+=sum[tree[p][a[i]]];//当前字符串为另一字符串的母串
else ans+=size[tree[p][a[i]]];//当前字符串为另一字符串的子串
}
printf("%d\n",ans);
}
int main()
{
int i,j,k;
int n,m;
cin>>n>>m;
for(i=1; i<=n; ++i)
{
scanf("%d",&k);
for(j=1; j<=k; ++j) scanf("%d",&a[j]);
insert(k);
}
for(i=1; i<=m; ++i)
{
scanf("%d",&k);
for(j=1; j<=k; ++j) scanf("%d",&a[j]);
quiry(k);
}
return 0;
}
:https://blog.youkuaiyun.com/luyehao1/article/details/86495109
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e5 + 10;
const int N = 1e6 + 10;
struct dd
{
int to, w;
};
int n;
vector<dd>tree[M];
int trie[N][2];
int ans,cnt;
void Insert(int x)
{
int root = 0;
for (int i = 30; i >= 0; i--)
{
int v = (x >> i) & 1;
if (!trie[root][v]) trie[root][v] = ++cnt;
root = trie[root][v];
}
}
int query(int x)
{
int root = 0;
int ans = 0;
for (int i = 30; i >= 0; i--)
{
int v = (x >> i) & 1;
if (trie[root][v ^ 1])
{
ans += (1 << i);
root = trie[root][v ^ 1];
}
else root=trie[root][v];
}
return ans;
}
void dfs(int root, int last, int sum)
{
ans = max(ans,query(sum));
for (int i = 0; i < tree[root].size(); i++)
{
int now= tree[root][i].to;
if (now == last) continue;
int w = tree[root][i].w^sum;
Insert(w);
dfs(now, root, w);
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i < n; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
tree[u].push_back(dd{ v,w });
tree[v].push_back(dd{ u,w });
}
Insert(0);
dfs(1, -1, 0);
printf("%d\n", ans);
return 0;
}