【算法基础】 Trie树

news2025/7/20 22:46:10

一、Trie树

Trie树用于高效存储和找字符串集合的数据结构。

二、Trie字符串统计

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 x;

  1. Q x 询问一个字符串在集合中出现了多少次。

共有 N�个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。

输入格式

第一行包含整数 N,表示操作数。

接下来 N行,每行包含一个操作指令,指令为 I xQ x 中的一种。

输出格式

对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。

每个结果占一行。

数据范围

1≤N≤2∗104

输入样例:

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

1
0
1

代码:

#include <iostream>

using namespace std;

const int N = 100010;

// 每个结点的子节点最多为26
//cnt存储以当前单词结尾的单词有多少个
//idx存储当前用到了哪个下标
//下标是0的点即使根节点,又是空结点
int son[N][26], cnt[N], idx; 
char str[N];


void insert(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]++;
    
}


int query(char str[])
{
    int p = 0;
    for (int i = 0; str[i]; i ++ )
    {
        int u = str[i] - 'a';
        if (!son[p][u]) return 0;
        p = son[p][u];
    }
    return cnt[p];
}

int main()
{
    int n;
    cin>>n;
    while (n -- )
    {
        char op[2];
        cin >> op >> str;
        if(op[0] =='I') insert(str);
        else cout << query(str) <<endl;
    }
    
    return 0;
}

三、最大异或对

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

输入格式

第一行输入一个整数 N

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

输出格式

输出一个整数表示答案。

数据范围

1≤N≤105

0≤Ai<231

输入样例:

3
1 2 3

输出样例:

3

代码:

1.暴力解法

#include <iostream>
#include <algorithm>

using namespace std;

const int N =1e5;

int n;
int a[N];

int main()
{

  cin >> n;
  for(int i = 0; i < n; i++) cin >> a[i];

  int res = 0;

  for(int i = 0; i < n;i++)
       for (int j = 0; j < n; j ++ )
           res = max(res,a[i]^a[j]);
         
  cout << res << endl;

  return 0;    
}

2.Trie 树解法

#include <iostream>
#include <algorithm>

using namespace std;

const int N =100010, M = 3100010;

int n;

int son[M][2], idx;
int a[N];

void insert(int x)
{
    int p = 0;
    for( int i = 30; i>=0; i--)
    {
        int &s = son[p][x >> i & 1];
        if(!s) s = ++ idx;//创建新结点
        p = s;
    }
}

int query(int x)
{
    int res= 0,p = 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;
}
int main()
{

  cin >> n;
  for(int i = 0; i < n; i++) 
  {
      cin >> a[i];
      insert(a[i]);
  }

  int res = 0;

  for(int i = 0; i < n;i++) res = max(res,query(a[i]));
  cout << res<<endl;
  return 0;    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#前端实现对pcl点云颜色根据强度特征动态变化突出指定对象

前言 本文主要介绍如何使用c# winform对点云颜色根据点云强度信息对显示的点云颜色进行动态调整。 目的是根据强度信息采用不同的颜色特征突出不同的物体。 一、点云强度是什么&#xff1f; 点云强度又可以叫做反射率&#xff0c; 通常常见的点云格式包括&#xff1a;以pcl为…

SpringBoot可以同时处理多少请求?

本文已收录至我的Github仓库DayDayUP&#xff1a;github.com/RobodLee/DayDayUP&#xff0c;欢迎Star ⭐⭐⭐⭐⭐转载请注明出处&#xff1a;https://blog.csdn.net/weixin_43461520/article/details/129207427 前言 前两天面试的时候&#xff0c;面试官问我&#xff1a;一个i…

【拿好了!Linux 运维必备的 13 款实用工具!】

​本文介绍几款 Linux 运维比较实用的工具&#xff0c;希望对 Linux 运维人员有所帮助。 查看进程占用带宽情况 – Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载&#xff1a; http://sourceforge.net/projects/nethogs/files/ne…

NPDP认证|产品研发过程中,产生冲突怎么办?

随着传统行业在研发过程中牵涉到很多利益相关方,这些相关方在产品研发过程中关注角度的不同,会产生各种各样的矛盾冲突&#xff0c;如研发与产品的冲突、运营与产品的冲突、客户与产品的冲突&#xff0c;那么产生冲突的原因是什么呢&#xff1f; 产生冲突的原因&#xff1f; 1…

Redis:实现全局唯一ID

Redis&#xff1a;实现全局唯一ID一. 概述二. 实现&#xff08;1&#xff09;获取初始时间戳&#xff08;2&#xff09;生成全局ID三. 测试为什么可以实现全局唯一&#xff1f;其他唯一ID策略补充&#xff1a;countDownLatch一. 概述 全局ID生成器&#xff1a;是一种在【分布式…

墨天轮发布数据库行业报告,创邻科技Galaxybase大放异彩

近日&#xff0c;知名数据库社区墨天轮发布《2022中国数据库行业年度分析报告》&#xff0c;该报告由墨天轮联合业界专家学者共同编写&#xff0c;共122页&#xff0c;详细总结了2022年数据库行业产学研用的发展近况、挑战以及对未来趋势的展望。旨在于给数据库行业带来有价值的…

Hadoop命令大全

HDFS分布式文件系统 &#xff0c; 将一个大的文件拆分成多个小文件存储在多台服务器中 文件系统&#xff1a; 目录结构&#xff08;树状结构&#xff09; "/" 树根&#xff0c; 目录结构在namenode中维护 目录 1.查看当前目录 2.创建多级目录 3.上传文件 4.查…

狂神说:面向对象(二)

一、创建与初始化对象new分配内存空间、默认初始化、构造器调用二、构造器特点&#xff1a;1. 没有返回值 2. 方法名与类名相同类里面啥都没写的时候&#xff0c;new一个这个类对象&#xff0c;java会生成一个默认构造函数&#xff08;构造器&#xff09;&#xff1a;构造器核心…

公司新招了个腾讯5年经验的测试员,让我见识到什么才是真正的测试天花板····

5年测试&#xff0c;应该是能达到资深测试的水准&#xff0c;即不仅能熟练地开发业务&#xff0c;而且还能熟悉项目开发&#xff0c;测试&#xff0c;调试和发布的流程&#xff0c;而且还应该能全面掌握数据库等方面的技能&#xff0c;如果技能再高些的话&#xff0c;甚至熟悉分…

Qt 进程间通信

Qt进程间通信的方法&#xff1a; TCP/IPLocal Server/Socket共享内存D-Bus &#xff08;Unix库&#xff09;QProcess会话管理 TCP/IP &#xff1a; 使用套接字的方式&#xff0c;进行通信&#xff08;之前介绍了&#xff0c;这里就不介绍了&#xff09;。 Local Server/Socket…

智能家居之主机--驱动层搭建

智能家居之主机--驱动层搭建bsp-底层驱动bsp_gpiobsp_adcbsp_uartbsp_timer伪调度bsp-底层驱动 bsp_gpio 利用一个config.h的配置文件&#xff0c;把所有要使用的gpio的属性配置好&#xff0c;这样有一个好处&#xff0c;比较集中&#xff0c;也比较好查&#xff0c;不需要一个…

fp32/fp64精度,4/8字节16进制转float/double十进制

1、IEEE-754 32位单精度浮点数&#xff08;4字节&#xff09; 1.1 32位单精度浮点数 其中&#xff0c; 32位16进制数包括1位符号位(SIGN)&#xff0c;8位指数位(EXPONENT)和 23位尾数位(MANTISSA)。 例如&#xff1a; 25.3可以表示为41CA6666&#xff08;0x41为高字节&#xf…

算法第十六期——动态规划(DP)之线性DP

【概述】 线性动态规划&#xff0c;是较常见的一类动态规划问题&#xff0c;其是在线性结构上进行状态转移&#xff0c;这类问题不像背包问题、区间DP等有固定的模板。 线性动态规划的目标函数为特定变量的线性函数&#xff0c;约束是这些变量的线性不等式或等式&#xff0c;目…

Mysql中关于查询日志的配置详解

查询日志 MySQL中的查询日志保存在文本文件中&#xff0c;能够记录MySQL中的所有数据操作。 开启查询日志 MySQL默认情况下没有开启查询日志&#xff0c;如果需要开启查询日志&#xff0c;则需要在 my.cnf 文件或者 my.ini 文件的 [mysqld] 选项下进行配置。例如&#xff0c;…

GoFrame工程目录设计介绍

GoFrame框架针对业务项目的目录设计&#xff0c;主体的思想来源于三层架构&#xff0c;但在具体实现中&#xff0c;对其进行了一定的改进和细化使其更符合工程实践和时代进步。 一.工程目录结构 GoFrame业务项目基本目录结构如下&#xff1a; 二.目录结构解释 对外接口 对…

浅谈智能电力运维管理系统在物业小区的应用分析

安科瑞 李亚俊 0引言 由于部分住宅小区存在电力设施纸质档案破损缺失、产权分界不清、查找故障点所在箱变&#xff08;箱式变电站&#xff0c;下同&#xff09;位置困难或小区出入口路径不明等情况&#xff0c;影响了抢修效率。为此&#xff0c;国网辽宁沈阳市沈北新区供电公…

IDEA Maven install Failed to execute goal org.apache.maven.plugins异常处理

目录一、异常错误二、原因三、解决方法修改pom.xml资源配置文件一、异常错误 由于服务器编译拦截了静态资源&#xff0c;导致出现异常&#xff0c;需要重新打包编译 打开IDEA带的Maven管理&#xff0c;双击clean清除由项目编译创建的target 再双击install安装jar包到本地仓库…

朴素贝叶斯笔记

贝叶斯公式在A 条件成立下&#xff0c;B的概率等于B的概率*在B条件成立下&#xff0c;A的概率/A的概率&#xff0c;推导假设一个学校中男生占总数的60%&#xff0c;女生占总数的40%。并且男生总是穿长裤&#xff0c;女生则一半穿长裤、一半穿裙子。1.正向概率。随机选取一个学生…

白盒测试方法的简单理解(通俗易懂)

白盒测试主要使用逻辑覆盖测试方法&#xff0c;包括语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、路径覆盖等。 假设逻辑判断流程图如下图所示&#xff0c;我们简单来说说每种白盒测试方法是如何来进行的。 一、语句覆盖 语句覆盖的定义是&#xff1a;程序中…

Openwrt中动态IPV6 防火墙的正确设置方法

环境&#xff1a;光猫桥接公网IPV6 问题&#xff1a;动态IPV6地址不知道怎么设置防火墙 解决办法&#xff1a;模糊匹配前缀&#xff0c;特定后缀 背景&#xff1a;将家中光猫桥接后&#xff0c;获得了公网的IPV6地址&#xff0c;可以从外部用IPV6访问家中的设备&#xff0c;但I…