关于Trie树的模板
Trie树又称单词查找树,Trie树,是一种树形结构。是一种哈希树的变种。典型应用是用于统计。排序和保存大量的字符串(但不仅限于字符串),所以常常被搜索引擎系统用于文本词频统计。
它的长处是:利用字符串的公共前缀来降低查询时间,最大限度地降低无谓的字符串比較。查询效率比哈希树高。 ——-百度百科
详细给出代码,这也是依据大牛们的一些代码整的。,还是太渣了。。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
const int maxn = 26;
struct Trie//结点声明
{
struct Trie *next[maxn];//孩子分支
bool isStr;//标记是否构成单词
};
void Insert(Trie *root,const char *s)//将单词s插入Trie树
{
if(root==NULL || *s=='\0')
return;
//int i;
Trie *p = root;
while(*s != '\0')
{
if(p->next[*s-'a'] == NULL) //假设不存在,则建立结点
{
Trie *tmp = (Trie*)malloc(sizeof(Trie));
for(int i=0; i<maxn; i++)
tmp->next[i] = NULL;
tmp->isStr = false;
p->next[*s-'a'] = tmp;
p = p->next[*s-'a'];
}
else
p = p->next[*s-'a'];
s++;
}
p->isStr = true;//单词结束的地方标记此处能够构成一个单词
}
int Find(Trie *root, const char *s)
{
Trie *p = root;
while(p!=NULL && *s!='\0')
{
p = p->next[*s-'a'];
s++;
}
return (p!=NULL && p->isStr==true);//在单词结束处的标记为true时,单词才存在
}
void Del(Trie *root)//释放整个Trie树的空间
{
for(int i=0; i<maxn; i++)
{
if(root->next[i] != NULL)
Del(root->next[i]);
}
free(root);
}
char s[100];
int main()
{
int m,n; //n为建立Trie树输入的单词数,m为要查找的单词数
Trie *root = (Trie *)malloc(sizeof(Trie));
for(int i=0; i<maxn; i++)
root->next[i] = NULL;
root->isStr = false;
scanf("%d",&n);
getchar();
for(int i=0; i<n; i++)//建立Trie树
{
scanf("%s",s);
Insert(root,s );
}
while(~scanf("%d",&m))
{
for(int i=0; i<m; i++)
{
scanf("%s",s);
if(Find(root, s) == 1)
puts("Yes");
else
puts("No");
}
puts("");
}
Del(root);
return 0;
}
关于Trie树的模板的更多相关文章
- LightOJ 1129 - Consistency Checker Trie树模板
题意:给出n条串判断是否存在一个串为另一个串的前缀. 思路:套Trie树的模板,先全部插入,再查找每个字串,如果查找字串完毕,但还存在下一个节点,说明存在前缀. /** @Date : 2016-11 ...
- 【数据结构与算法】Trie(前缀树)模板和例题
Trie 树的模板 Trie 树的简介 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.他的核心思想是空间换 ...
- ZOJ 1109 Language of FatMouse 【Trie树】
<题目链接> 题目大意: 刚开始每行输入两个单词,第二个单词存入单词库,并且每行第二个单词映射着对应的第一个单词.然后每行输入一个单词,如果单词库中有相同的单词,则输出它对应的那个单词,否 ...
- HDU - 1251 统计难题(Trie树)
有很多单词(只有小写字母组成,不会有重复的单词出现) 要统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). 每个单词长度不会超过10. Trie树的模板题.这个题内存把控不好容易MLE. ...
- 第一课trie 树 POJ 2001
最短前缀(Openjudge上抄的) 总时间限制: 1000ms 内存限制: 65536kB 描述 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的 ...
- HDU 1251 Trie树模板题
1.HDU 1251 统计难题 Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...
- Phone list(Trie树模板)
Phone List 共t组数据,给定n个长度不超过10的字符串,问其中是否存在两个数S,T,使得S是T的前缀. 存在则输出NO,不存在输出YES 输入样例#1: 2 3 911 97625999 9 ...
- hiho #1014 : Trie树(模板)
Trie树 [题目链接]Trie树 &题意: 输入 输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英 ...
- 模板 Trie树
模板 Trie树 code: #include <iostream> #include <cstdio> using namespace std; const int wx=2 ...
随机推荐
- HDUOJ----John
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- Oracle实例
ORA-12505 Listener refused the connection with following error:ORA-12505,TNS:listener 确定这是连接数据库的SID错 ...
- 重写lucene.net的分词器支持3.0.3.0版本
lucene.net中每个分词器都是一个类,同时有一个辅助类,这个辅助类完成分词的大部分逻辑.分词类以Analyzer结尾,辅助类通常以Tokenizer结尾.分类词全部继承自Analyzer类,辅助 ...
- RAC安装gird,第一个节点执行root.sh报"The ora.asm resource is not ONLINE"错误
RAC版本:11.2.0.4 OS版本:linux 6.4 RAC安装gird,第一个节点执行root.sh运行失败,报"The ora.asm resource is not ONLINE ...
- 内存管理算法--Buddy伙伴算法【转】
转自:http://blog.csdn.net/orange_os/article/details/7392986 Buddy算法的优缺点: 1)尽管伙伴内存算法在内存碎片问题上已经做的相当出色,但是 ...
- Linux内核同步 - classic RCU的实现
一.前言 无论你愿意或者不愿意,linux kernel的版本总是不断的向前推进,做为一个热衷于专研内核的工程师,最大的痛苦莫过于此:当你熟悉了一个版本的内核之后,内核已经推进到一个新的版本,你曾经熟 ...
- Unix环境高级编程(四)数据系统文件和信息
本章主要介绍了Unix系统的正常运行要使用的与系统有关的数据文件和信息.如:口令文件,阴影文件.组文件.附加组.系统标识.时间和日期历程. 口令文件,即Unix系统用户数据库,存储在/etc/pass ...
- 【iOS开发-56】案例BUG:button的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet
接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.button多功能使用方法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击optionbut ...
- Android-SQLiteOpenHelper
Android-SQLiteOpenHelper 一 概念 是对SOLiteDatabase的封装.主要用于建立和版本号控制,方便我们去建立库表结构 二 用法 又一次封装一个MySqliteOpenH ...
- SpringBoot进阶
一.表单验证 二.AOP处理请求 AOP是一种编程范式.与语言无关,是一种程序设计思想. 面向过程到面向对象.换个角度看世界,换个姿势处理问题. 2.1AOP实例-http请求 MAVEN添加依赖:o ...