Trie总结

Trie 树即为字典树
这个树可以把所有我们要在文本中所查询的前缀都记录下来
当我们拿到一个文本串 需要从里面找出所有前缀串的数目我们就可以用这个结构
拿着我们的文本到这个树里面走一走就得到有多少个前缀了

我们来看 当我们拿到一个前缀
不断地把这个前缀插入到树中
对每一个节点 可以连到26个分节点去
这个树具体有两个操作
一个是add操作
还有一个就是匹配操作

建立过程
Trie的头结点是空的
我们将我们想要统计的串加入到以头结点为根的树里
每一个前缀都是从根节点的一条路径

我们可以看一道例题HDU 1251
输入多个单词
然后再输入多个前缀 每一个前缀输出字符串中出现当前前缀的单词数量

这里我们就可以把所有单词全部add到字典树中
为他们建立查询路径
比如这里的trie的结构我们可以这么设置

struct node{int time;node *next[26];init(){time = 0;for(int i=0;i<26;i++)next[i] = NULL;}
}e;

time就记录这里当前前缀已经走过多少次 也就是add过多少次
next表示 指向后面的字符的指针数组

add操作

void add(char s[]){int len = strlen(s);node *p = &e; //指向trie的指针for(int i=0;i<len;i++){if(!(p->next[s[i]-'a'])){//如果走到这里为空 就重新申请node *q = (node*)malloc(sizeof(node));(*q).init();	p->next[s[i]-'a']=q;}p = p->next[s[i]-'a'];p->time++;
//并记录前缀次数
}

查询:


int match(char s[]){int len = strlen(s);node *p = &e;for(int i=0;i<len;i++){if(p->next[s[i]-'a']==NULL)return 0;p = p->next[s[i]-'a'];}return p->time;
}

这里也就是把我们所要查找的串拿进来一个个匹配 看看能匹配到多少个
返回我们记录的次数

完整代码为:

#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct node{int time;node *next[26];void init(){time = 0;for(int i=0;i<26;i++)next[i] = NULL;}
}e;
void add(char s[]){int len = strlen(s);node *p = &e; for(int i=0;i<len;i++){if(!(p->next[s[i]-'a'])){node *q = (node*)malloc(sizeof(node));(*q).init();	p->next[s[i]-'a']=q;}p = p->next[s[i]-'a'];p->time++;}
}
int match(char s[]){int len = strlen(s);node *p = &e;for(int i=0;i<len;i++){if(p->next[s[i]-'a']==NULL)return 0;p = p->next[s[i]-'a'];}return p->time;
}
char a[15];
int main()
{e.init();while(*gets(a))add(a);while(~scanf("%s",a)){printf("%d\n",match(a));}return 0;
} 

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

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

相关文章

运用begin和end截取值

程序员在取值的时候会面临截取某一个值&#xff0c;前段时间在大佬那里学习了一个js取值&#xff0c;在<c:forEach items"${potcontestlist}" var"oldcontest1" begin"0" end"3">取值中如果需要截取某个值加begin先取第一个值的…

[程序员面试金典][JAVA][第02.01题][移除重复节点][Set][双指针]

【问题描述】[简单] 编写代码&#xff0c;移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入&#xff1a;[1, 2, 3, 3, 2, 1]输出&#xff1a;[1, 2, 3] 示例2:输入&#xff1a;[1, 1, 1, 1, 2]输出&#xff1a;[1, 2] 提示&#xff1a;链表长度在[0, 20000]范围…

24.JSP 客户端请求

JSP 客户端请求 当浏览器请求一个网页时&#xff0c;它会向网络服务器发送一系列不能被直接读取的信息&#xff0c;因为这些信息是作为HTTP信息头的一部分来传送的。您可以查阅HTTP协议来获得更多的信息。 下表列出了浏览器端信息头的一些重要内容&#xff0c;在以后的网络编…

25.二维码简介

1二维码概述 2二维码 3二维码 二维码概念 二维码发展历史 二维码分类 二维码优缺点 QR code

HDU-1251 统计难题 map写法

#include<cstdio> #include<cstring> #include<cstdlib> #include<string> #include<map> using namespace std;map<string,int>n; char a[12]; int main() {while(*gets(a)){// 不断读入一个串 直到读空就退出来了n[a];for(int istrlen(a…

[剑指offer][JAVA]面试题第[34]题[二叉树中和为某一值的路径][回溯]

【问题描述】[中等] 输入一棵二叉树和一个整数&#xff0c;打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c;5/ \4 8/ / \11 13 4/ \ /…

python --条件判断和语句控制

1、while(斐波纳契数列) python中没有do while a,b 0,1 while b < 1000:print(b,end )a,b b,ab 无线循环 无限循环在服务器上客户端的实时请求非常有用。 #!/usr/bin/python3 var 1 while var 1 : # 表达式永远为 truenum int(input("输入一个数字 :")…

26.idea导入jar包

1点击file---project structure 2点击modules----dependencies 3点击加号 4选中所选资源

CodeForces-887B 技巧DFS

标题 最大不超过3个筛子 让我们从其中任选筛子组合成数据 问我们组不成的最小的数是多少 分析 要模拟把最大3个筛子 选出1,2,3个的情况去组合 我们可以枚举所要选的数的数量 用next_permutation得到这n个数的全排列 这样不论的选几个筛子 都会便利到所有情况 然后在把所有…

CSS3---4.伪元素选择器

a)重点&#xff1a;E::before、E::after i.是一个行内元素&#xff0c;需要转换成块:display:block float:** position: ii.必须添加content,哪怕不设置内容&#xff0c;也需要content:”” iii.E:after、E:before 在旧版本里是伪类&#xff0c;在新版本里是伪元素&#xff…

[Leedcode][JAVA][第41题][缺失的第一个正数][哈希表][数组]

【问题描述】[困难] 给你一个未排序的整数数组&#xff0c;请你找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0] 输出: 3 示例 2:输入: [3,4,-1,1] 输出: 2 示例 3:输入: [7,8,9,11,12] 输出: 1提示&#xff1a;你的算法的时间复杂度应为O(n)&#xff0c;并且只能使用常…

27.用zxing生成二维码

先在idea里面导入jar包 链接&#xff1a;https://pan.baidu.com/s/1UdorNg8o0A4FsElghqkJyw 提取码&#xff1a;c4bt 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import co…

二、CSS选择器

1.CSS派生选择器 概念&#xff1a;通过依据元素在其位置的上下文关系来定义样式。 实例&#xff1a; <!--index.html--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><…

[剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

【问题描述】[简单] 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2限制&#xff1a;1 < 数组长度 < 50000【解答思…

codeforce 884C - Bertown Subway DFS+图论

分析 题意说输入数据有两个规则&#xff1a; 1 每个i只有一个pi表示i站的目的地 i可以等于pi 2 每个pi都指向唯一的一个站i 那么也就是说i指向的目的只有一个且唯一 每个目的由唯一的始发站出来 所以也就是说 图中的每一个点只有一条单向边 那么当我们求最大的数量的可达对…

笔记03

linux 创建连接命令 ln -s 软链接 这是linux中一个非常重要命令&#xff0c;请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接&#xff0c;这个命令最常用的参数是-s, 具体用法是&#xff1a;ln -s 源文件 目标文件。 当 我们需要在不同的目录&#…

[Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]

【问题描述】[中等] 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的连续子数组&#xff0c;并返回其长度。如果不存在符合条件的连续子数组&#xff0c;返回 0。示例: 输入: s 7, nums [2,3,1,2,4,3] 输出: 2 解释: 子数…

UVa-10820 Send a Table 欧拉函数

题意 交表 由于f(k∗x,k∗y)可以由f(x,y)递推出来 让我们求 在x&#xff0c;y都不大于n的情况下 计算最少需要计算多少不同的项 n<50000 分析 那么也就是说两个数由共因子的不必计算 只计算两个数没有共因子的 那么也就是说 每个数我们只需要找到与他互质的个数就可以了…

29使用QRcode方式生成二维码

首先idea导入jar包 链接&#xff1a;https://pan.baidu.com/s/1IZvMHzL2tx1zB2UIbQtiOg 提取码&#xff1a;garc 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import…

Mybatis入门---一对多、多对多

前几天自己配置了Mybatis的高级查询&#xff1a;一对多和多对多&#xff0c;现在记录一下&#xff0c;方便以后用到的时候再回顾&#xff0c;下面是具体的操作步骤 一、首先就是配置Mybatis的xml文件及mapper的xml文件&#xff0c;在这里就不多说了&#xff0c;之前写过这个基本…