Acwing Trie树

news/2024/9/19 7:52:25 标签: c++, 算法, 数据结构

Trie树(字典树)

主要用途:是用来高效存储和查找字符串集合的一种数据结构。查找时,可以高效的查找某个字符串是否在Trie树中出现过,并且可以查找出现了多少次

利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
图示如下:
图示
主要性质:

  • 根节点不包含字符,除根节点外的每一个子节点都包含一个字符;
  • 从根节点到某一个节点,路径上经过地字符连接起来,为该节点对应地字符串;
  • 每个节点地所有子节点包含的字符都不相同;
  • 从第一字符开始有连续重复的字符只占用一个节点,比如上面的catch和cat中重复的单词cat只占用了一个节点。

Acwing 835 Trie字符串统计

维护一个字符串集合,支持两种操作:
I x 向集合中插入一个字符串 x;
Q x 询问一个字符串在集合中出现了多少次。
共有 N个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。

输入
输入样例

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

1
0
1

实现思路:

  • 设置一个二维数组son[p][u]初始为0,p代表当前接待你,u代表当前节点地某个子节点(u
    的取值为0~25对应26个字母),即son[p][u]代表p节点下连接着下标为u的字母;

  • 插入操作:设置一个idx指向要操作的数组下标位置(作用同链表中的idx),每次插入一个字符串,循环处理每个字符。利用u=str[i]- 'a’将每个字符转化为整数操作,判断s[p][u]是否为0.若为0,不存在该字符,就插入该字符,即令son[p][u]=++idx,然后下移到字节点继续插入字符串的下一个字符;若不为0,就表示之前已经插入过该字符,直接下移。最后该字符串插入结束,设置一个数组cnt[]标记该字符串出现次数,cnt[p]表示以p结尾的字符串出现的次数;

  • 查询操作:类似插入操作进行判断,若出现某一次son[p][u]为0就此结束,意味着不存在该字符串,直到循环结束;若存在该字符串,返回计数数组cnt[p]。

具体代码:

#include <iostream>

using namespace std;

const int N=100010;
char str[N];
//son[][]存储树中每个节点的子节点
//cnt[]存储以每个节点结尾的单词数量
//idx表示当前用到了哪个下标
//0号点既是根节点,又是空节点

//插入一个字符串
int son[N][26],cnt[N],idx;

void insert(char str[]){
    int p = 0;//树的指针,用于下移,初始指向根节点 根节点不存储字符
    for(int i=0;str[i];i ++){
        int u = str[i] - 'a';//u代表当前节点的某个子节点,映射为数字0~25
        if(!son[p][u]) son[p][u] = ++ idx;//如果当前点不存在对应的字母,创建出来
        //son[p][u]不为0代表p结点下连接着下标为u的字母
        p=son[p][u];//指针下移
    }
    cnt[p] ++;//以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];//以p结尾的单词数量
}

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

以上就是Trie树实现对字符串的统计应用。


http://www.niftyadmin.cn/n/5665226.html

相关文章

828华为云征文|华为Flexus云服务器打造《我的世界》游戏服务器

一、引言 在游戏的世界里&#xff0c;《我的世界》以其极高的自由度和创造性吸引了无数玩家。拥有一个专属的《我的世界》游戏服务器&#xff0c;可以让玩家和朋友们尽情享受定制化的游戏体验。2024年9月14日&#xff0c;我将向大家分享如何利用华为Flexus云服务器打造属于自己…

Foundation 折叠列表

Foundation 折叠列表 引言 在网页设计和开发中,折叠列表是一种常见且实用的界面元素,它允许用户展开和收起内容以节省空间并提高用户体验。Foundation 是一个流行的前端框架,它提供了一套强大的工具和组件来帮助开发者快速构建响应式和现代化的网页。本文将详细介绍如何在…

大语言模型特供版汉字:基于部首分解与图神经网络的多因素表示

汉字嵌部首&#xff0c;图卷蕴深机。嵌入相结合&#xff0c;结构见玄机。泛化能力强&#xff0c;共享共根基。 针对汉字在新环境下的调整&#xff0c;本文提出了一种结合传统字符嵌入与部首结构的图表示法&#xff0c;以捕捉汉字的语义和组成结构&#xff0c;专供大模型理解汉字…

python中的argparse的用法

argparse是 Python 标准库中用于命令行参数解析的模块。它可以方便地解析命令行参数&#xff0c;并提供了丰富的功能来处理各种参数类型和选项。 import argparse# 创建 ArgumentParser 对象 parser argparse.ArgumentParser(description这是一个示例程序&#xff0c;用于演示…

【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

架构师论文备考-论面向对象建模及应用

摘要 2022年3月1日&#xff0c;我有幸加入公司新智慧公交项目的开发团队&#xff0c;担任项目架构决策的关键角色&#xff0c;并主要负责核心调度模块的设计与开发。在项目启动阶段&#xff0c;我们采纳了再工程的方法论&#xff0c;深入分析了既有平台的核心代码和功能&#x…

Canopen-pn有线通信标准在汽车制造中至关重要

电子元件越来越多地被集成到车辆中&#xff0c;从而实现与物联网世界的连接。该行业中主要的高速串行接口方法包括控制器局域网 (CAN) 总线 。CAN 是运输应用中使用的一种强大的总线标准。它旨在允许微控制器(MCU) 和相关组件与彼此的应用程序进行通信。这无需系统具有主机即可…

MySQL示例:创建数据库与表

目录 创建数据库 创建表 注意事项&#xff1a; 创建数据库 需要登录到MySQL服务器。如果已经连接到了MySQL服务器&#xff0c;可以使用以下命令来创建一个新的数据库&#xff1a; CREATE DATABASE IF NOT EXISTS example_db; 这里的example_db是你想要创建的数据库的名字。…