当前位置: 首页 > news >正文

字典树(Trie)

字典树(Trie)的基本概念

字典树是一种树形数据结构,用于高效存储和检索字符串集合。其核心特点是利用字符串的公共前缀减少查询时间,适合处理前缀匹配、词频统计等问题。

字典树的C++实现(模板)

struct treename {int nex[500005][26];int cnt = 0;int exist[500005]; // 该结点结尾的字符串是否存在void initialize() {//初始化结构体memset(nex, 0, sizeof(nex));memset(exist, 0, sizeof(exist));cnt == 0;}void insert(string s) {// 插入字符串int len = s.size();int p = 0;for (int i = 0; i < len; i++) {int j = s[i] - 'a';if (!nex[p][j]) nex[p][j] = ++cnt;p = nex[p][j];}exist[p] = 1;}bool find(string s) {//查找字符串(是否存在以某一样的字符串)int len = s.size();int p = 0;for (int i = 0; i < len; i++) {int j = s[i] - 'a';if (!nex[p][j]) return false;p = nex[p][j];}if(exist[p]!=0) {return true;}else {return false;}}
}tree;
应用场景
  • 自动补全:根据前缀快速匹配候选词。
  • 拼写检查:快速判断单词是否存在。
  • IP路由:最长前缀匹配。

复杂度分析

  • 时间:插入和查询均为O(L),L为字符串长度。

P2580 于是他错误的点名开始了 - 洛谷

思路:

将exist在每次查询后,如果存在就++,然后判断其值。

#include<bits/stdc++.h>
#define ll long long 
#define endl "\n"
using namespace std;
struct treename {int nex[500005][26];int cnt = 0;int exist[500005]; // 该结点结尾的字符串是否存在void initialize() {//初始化结构体memset(nex, 0, sizeof(nex));memset(exist, 0, sizeof(exist));cnt == 0;}void insert(string s) {// 插入字符串int len = s.size();int p = 0;for (int i = 0; i < len; i++) {int j = s[i] - 'a';if (!nex[p][j]) nex[p][j] = ++cnt;p = nex[p][j];}exist[p] = 1;}int find(string s) {//查找字符串(是否存在以某一样的字符串)int len = s.size();int p = 0;for (int i = 0; i < len; i++) {int j = s[i] - 'a';if (!nex[p][j]) return -1;p = nex[p][j];}if(exist[p]!=0) {exist[p]++;return p;}else {return -1;}}
}tree;
int n, m;void solve() {tree.initialize();cin >> n;string s;for (int i = 0; i < n; i++) {cin >> s;tree.insert(s);}cin >> m;for (int i = 0; i < m; i++) {cin >> s;int r = tree.find(s);if (r == -1) {cout << "WRONG" << endl;}else if (tree.exist[r] == 2) {cout << "OK" << endl;}else {cout << "REPEAT" << endl;}}return;
}
int main(){ios::sync_with_stdio(false);        // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr);             // 解除cin与cout绑定int t = 1;//cin >> t;while (t--) {solve();}return 0;
}

http://www.dtcms.com/a/395970.html

相关文章:

  • AI浏览器概述:Browser Use、Computer Use、Fellou
  • 「docker」三、3分钟快速安装docker
  • Altium Designer(AD)自定义PCB形状
  • 基于ZYNQ的创世SD NAND卡读写TXT文本实验
  • 文心快码入选2025人工智能AI4SE“银弹”标杆案例
  • 什么是SDN(Software Defined Netwok)
  • GitLab-如何基于现有项目仓库,复制出新的项目仓库
  • 本科大二第三周学习周报
  • 三、自定义Button模板触发器(纯XAML)
  • tar 将多个文件或目录打包成一个单独的归档文件
  • 2025新版 WSL2 + Docker Desktop 下载安装详细全流程指南 实现容器化管理,让开发效率起飞
  • 【LangChain4j】大模型实战-SpringBoot(阿里云百炼控制台)
  • Spring Security / Authorization Server 核心类中英文对照表
  • SqlHelper自定义的Sql工具类
  • 每周读书与学习->初识JMeter 元件(二)
  • 西门子 S7-200 SMART PLC 实操案例:中断程序的灵活应用定时中断实现模拟量滤波(上)
  • 测试分类(1)
  • 广州创科——湖北房县汪家河水库除险加固信息化工程(续集)
  • QT(5)
  • 仓颉语言宏(Cangjie Macros)全面解析:从基础到实战
  • linux RAID存储技术
  • 【每日一问】交流电和直流电有什么区别?
  • Postman使用指南
  • 软件架构面试题及答案
  • 【STM32】基于串口的bootloader
  • 【STM32】中断
  • how many penguins in ur linux你有几只企鹅呢?
  • windows1122h2怎么升级24h2
  • ansible-playbook的使用
  • Zabbix7 监控USG6300E 并发IPv4会话数