字典树 trie

简介: 字典树 trie

字典树是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较

图示如下

cac190f8be82193be8f9e06d9de5777d_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2plcnJ5MjAxODM=,size_16,color_FFFFFF,t_70#pic_center.png

例题: Acwing.143最大异或对


在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?


输入格式

第一行输入一个整数 N。


第二行输入 N 个整数 A1~AN。


输出格式

输出一个整数表示答案。


数据范围

1≤N≤105,

0≤Ai<231

输入样例:

3

1 2 3

输出样例:

3


#include<bits/stdc++.h>
using namespace std;
int tire[101000*31][2],a[101000];
int id;
void insert(int x)
{
  int p=0;               //根节点 
  for(int i=30;i>=0;i--) //从最大位开始找 
  {
    int u=x>>i&1;      //取x的第i位二进制数是什么 
    if(!tire[p][u])    //如果插入中发现没有该子节点,开出这条路 
    tire[p][u]=++id;   
    p=tire[p][u];      //指针指向下一层 
  }
}
int find(int x)
{
  int p=0,sum=0;        //用sum来存取当前路径表示的数是什么 
  for(int i=30;i>=0;i--)//从最大位开始找 
  {
    int u=x>>i&1; 
    if(tire[p][!u])   //如果当前层有对应的不相同的数  
    p=tire[p][!u],sum=sum*2+1;//p指针就指到不同位置的地址,*2代表左移1位 加上下一位 
    else
    {
    p=tire[p][u];
    sum=sum*2;
    }
  }
  return sum;
}
int main()
{
  int n,sum=0;
  cin>>n;
  id=0;
  for(int i=0;i<n;i++)
  {
    cin>>a[i];
    insert(a[i]);
  }
  for(int i=0;i<n;i++)
  {
    sum=max(sum,find(a[i]));
  }
  cout<<sum<<endl;
}

目录
相关文章
|
4月前
|
搜索推荐
前缀树Trie
前缀树Trie
|
4月前
|
NoSQL 容器 消息中间件
字典树 (Trie)
字典树 (Trie)
|
4月前
|
存储 C++
leetcode-208:实现 Trie (前缀树/字典树)
leetcode-208:实现 Trie (前缀树/字典树)
24 0
|
6月前
|
存储 Python
字典树(Trie,
字典树(Trie,也称为前缀树或单词查找树)是一种用于存储字符串的树形数据结构。它是一种特殊的多叉树,其中每个节点都包含一个字符和一个指向其子节点的指针数组。字典树的主要作用是用于快速查找字符串和处理字符串的前缀。
35 6
|
10月前
|
搜索推荐 数据格式
Trie字典树
Trie字典树
59 0
Trie字典树
|
11月前
理解前缀树
理解前缀树
39 0
|
12月前
|
存储 机器学习/深度学习 算法
|
存储
前缀树
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
59 0
前缀树
|
Java C++
字典树(前缀树)
字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。
83 0