字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

又称单词查找树Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

假设有abc,abcd,abd, b, bcd,efg,hii这7个单词,可构建字典树如下:

 

查找一个字符串时,我们只需从根结点按字符串中字符出现顺序依次往下走。如果到最后字符串结束时,对应的结点标记为红色,则该字符串存在;否则不存在。
插入时也只需从根结点往下遍历,碰到已存在的字符结点就往下遍历,否则,建立新结点;最后标记最后一个字符的结点为红色即可。

性质 

  它有3个基本性质:

      根节点不包含字符,除根节点外每一个节点都只包含一个字符。

      从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

      每个节点的所有子节点包含的字符都不相同。

基本操作 

      其基本操作有:查找 插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单.

搜索字典项目的方法为: 

  (1) 从根结点开始一次搜索;

  (2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

  (3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。

  (4) 迭代过程……

  (5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

  其他操作类似处理

以上内容来自百度百科。对应练习:ZOJ1109  HDU1251

ZOJ1109 Language of FatMouse

map方法 1320MS 9556K

复制代码
代码
复制代码
#include<iostream> #include<string> #include<map> #pragma warning (disable:4786) using namespace std; int main() { map<string,string> m; int len,i; char str[40],a[20],b[20]; while(1) { gets(str); len=strlen(str); if(len==0) break; for(i=0;str[i]!=' ';i++); strncpy(a,str,i); a[i]=0; strncpy(b,str+i+1,len-i-1); b[len-i-1]=0; m[b]=a; } map<string,string>::iterator it; while(scanf("%s",str)!=EOF) { it=m.find(str); if(it!=m.end()) cout<<(*it).second<<endl; else puts("eh"); } return 0; }
复制代码
复制代码

字典树:140MS 14960K

复制代码
代码
复制代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 100006 typedef struct node{ char s[12]; int h; struct node *next[26]; }*Tree,T; void init(Tree &root) { root=(Tree)malloc(sizeof(T)); root->h=0; for(int i=0;i<26;i++) root->next[i]=NULL; } void insert(char path[],char s[],Tree root) { int len,i,j; len=strlen(path); for(i=0;i<len;i++) { if(root->next[path[i]-'a']==NULL) { Tree t=(Tree)malloc(sizeof(T)); for(j=0;j<26;j++) { t->next[j]=NULL; t->h=0; } root->next[path[i]-'a']=t; } root=root->next[path[i]-'a']; } root->h=1; strcpy(root->s,s); } void find(char s[],Tree root) { int len,i; len=strlen(s); for(i=0;i<len;i++) { if(root->next[s[i]-'a']!=NULL) root=root->next[s[i]-'a']; else break; } if(i==len && root->h==1) puts(root->s); else puts("eh"); } int main() { Tree root; int len,i; char str[25],a[12],b[12]; init(root); while(1) { gets(str); len=strlen(str); if(len==0) break; for(i=0;str[i]!=' ';i++); strncpy(a,str,i); a[i]=0; strncpy(b,str+i+1,len-i-1); b[len-i-1]=0; insert(b,a,root); } while(scanf("%s",str)!=EOF) find(str,root); return 0; }
复制代码
复制代码

 

HDU1251 统计难题  140MS 43736K

复制代码
代码
复制代码
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{ int cnt; struct node *next[26]; }*Tree,T; Tree root; void insert(char *str) //建字典树 { int i; Tree p,newnode; p=root; for(; *str;str++) { if(p->next[*str-'a']!=NULL) { p=p->next[*str-'a']; p->cnt++; } else { newnode=(Tree)malloc(sizeof(T)); for(i=0;i<26;i++) newnode->next[i]=NULL; p->next[*str-'a']=newnode; p=p->next[*str-'a']; p->cnt=1; } } } int find(char *str) //查找 { Tree p; p=root; for(;*str;str++) { if(p->next[*str-'a']!=NULL) p=p->next[*str-'a']; else return 0; } return p->cnt; } int main() { int i; char str[20]; root=(Tree)malloc(sizeof(T)); for(i=0;i<26;i++) root->next[i]=NULL; root->cnt=0; while(gets(str)) { if(strcmp(str,"")==0) break; insert(str); } while(gets(str)) printf("%d\n",find(str)); return 0; }
复制代码
复制代码

 

PKU1204 Word Puzzles

字典树:1485MS 14320K(对给定的单词建树,对表进行暴力search)

复制代码
代码
复制代码
#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1002 typedef struct tree{ int count; struct tree *next[26]; }*Tree,T; Tree root; int l,c,w; char map[N][N]; int result[N][3]; int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}}; void insert(char *s,int con) { Tree p=root,q; for(int i=0;s[i];i++) { if(p->next[s[i]-'A']==NULL) { q=(Tree)malloc(sizeof(T)); memset(q->next,0,sizeof(q->next)); q->count=-1; p->next[s[i]-'A']=q; } p=p->next[s[i]-'A']; } p->count=con; } void search(int x,int y,int k) { int x1=x,y1=y; Tree p=root; while(x1>=0 && x1<l && y1>=0 && y1<c) { int id=map[x1][y1]-'A'; if(p->next[id]==NULL) break; else p=p->next[id]; if(p->count!=-1) { result[p->count][0]=x; result[p->count][1]=y; result[p->count][2]=k+'A'; } x1+=dir[k][0]; y1+=dir[k][1]; } } void slove() { int i,j,k; for(i=0;i<l;i++) for(j=0;j<c;j++) for(k=0;k<8;k++) search(i,j,k); for(i=0;i<w;i++) printf("%d %d %c\n",result[i][0],result[i][1],result[i][2]); } int main() { int i; char word[N]; scanf("%d%d%d",&l,&c,&w); getchar(); root=(Tree)malloc(sizeof(T)); memset(root->next,0,sizeof(root->next)); for(i=0;i<l;i++) gets(map[i]); for(i=0;i<w;i++) { gets(word); insert(word,i); } slove(); return 0; }
复制代码
复制代码

据说这题还可以用AC自动机实现,不了解AC自动机,有待提高……

 

HDU1075 同ZOJ1109同一道理,字典树基本应用。

map方法 3375MS 42368K 752B

复制代码
代码
复制代码
#include<iostream> #include<string> #include<map> using namespace std; int main() { map<string,string> M; string a,b; cin>>a; while(cin>>a,a!="END") { cin>>b; M[b]=a; } cin>>a; getchar(); char tmp[3005]; while(gets(tmp),strcmp(tmp,"END")) { int len=strlen(tmp); tmp[len++]=' '; tmp[len]=0; b=""; for(int i=0;i<len;i++) { if(!islower(tmp[i])) { if(M[b]!="") cout<<M[b]; else cout<<b; b=""; if(i!=len-1) cout<<tmp[i]; } else b+=tmp[i]; } cout<<endl; } return 0; }
复制代码
复制代码

 

字典树:437MS 59796K 1274B(可以用做模板了吧)

复制代码
代码
复制代码
#include<stdio.h> #include<string.h> #include<ctype.h> #include<stdlib.h> typedef struct node{ node *next[26]; int h; char word[12]; node() { h=0; memset(next,0,sizeof(next)); } }*Tree,T; Tree root=new node(); void insert(char *eng,char *mar) { Tree p=root; while(*mar) { int id=*mar-'a'; if(p->next[id]==NULL) p->next[id]=new node(); p=p->next[id]; mar++; } p->h=1; strcpy(p->word,eng); } char *find(char *str) { Tree p=root; while(*str) { int id=*str-'a'; if(p->next[id]==NULL) break; p=p->next[id]; str++; } if(*str==NULL && p->h==1) return p->word; else return NULL; } int main() { int i,k,len; char a[12],b[12],tmp[3005],tp[3005]; char *p; scanf("%s",a); while(scanf("%s",a) && strcmp(a,"END")!=0) { scanf("%s",b); insert(a,b); } scanf("%s",a); getchar(); k=0; while(gets(tmp),strcmp(tmp,"END")) { len=strlen(tmp); tmp[len++]=' '; tmp[len]=0; for(i=0;i<len;i++) { if(!islower(tmp[i])) { tp[k]=0; k=0; p=find(tp); if(p) printf("%s",p); else printf("%s",tp); if(i!=len-1) putchar(tmp[i]); } else tp[k++]=tmp[i]; } puts(""); } return 0; }
复制代码
复制代码

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

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

相关文章

Codeforces Round #498 (Div. 3) F. Xor-Paths

题目链接&#xff1a;F. Xor-Paths 题解&#xff1a;从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc.h>2 #include<set>3 #include<cstdio>4 #include<iomanip>5 #include<iostream>6 #include<string>7 #include<cst…

创建健壮的微服务架构所涉及的组件

在本文中&#xff0c;我们将简要学习构建强大的微服务应用程序所需的各种软件组件。 在简要了解每个架构组件之前&#xff0c;我们将陈述设计微服务架构时出现的一般查询。 1.微服务架构组件 每当我们创建微服务应用程序时&#xff0c;我们都会想到以下问题 我们将如何注册微…

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

jax-rs jax-ws_JAX-WS入门

jax-rs jax-wsJAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.e…

lingo解题报告内容解释

1.2菜单介绍 1.2.1 File 1 New 新建一个窗口,当你执行这个命令时,会出现如下对话框: 你可以在对话框中选择你想要建立的类型.类型如下: 1)扩展名为(*.lg4) LG4格式是LINGO4.0的版本,是在Windows下最主要的储存文件格式,这种格式支持字体格式,自定义格式以及动态连接, LG4以二进…

OpenShift上的无痛集装箱化JBoss通用贷款处理

我们从头到尾讨论了各个层次&#xff0c;但尚未为您提供除Red Hat之外的任何应用程序开发工具。我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 容器开发套件&#xff08;CDK&#xff09; 。 到目前为止&#xff0c;您所拥有的只是一个…

多任务编程—多进程

什么是多任务编程&#xff1f; 多任务编程其实和计算机系统内核有关&#xff0c;通过程利用多个计算机内核同时执行程序&#xff0c;以此来提升程序执行的效率。 多任务编程其中包括&#xff0c;多进程、多线程和多协程&#xff0c;这三种多任务编程各有各的优点和缺点&#xf…

java锁实现_Java锁实现

java锁实现我们都将第三方库用作开发的正常部分。 通常&#xff0c;我们无法控制其内部。 JDK随附的库是一个典型示例。 这些库中的许多库都使用锁来管理争用。 JDK锁具有两种实现。 一个使用原子CAS样式指令来管理索赔过程。 CAS指令往往是最昂贵的CPU指令类型&#xff0c;并且…

洛谷 P1027 Car的旅行路线

P1027 Car的旅行路线 题目描述 又到暑假了&#xff0c;住在城市 AA 的 CarCar 想和朋友一起去城市 BB 旅游。她知道每个城市都有 44 个飞机场&#xff0c;分别位于一个矩形的 44 个顶点上&#xff0c;同一个城市中 22 个机场之间有 11 条笔直的高速铁路&#xff0c;第 II 个城市…

API

api 百科名片 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。目…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…

使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 我们刚刚发布了Java SDK的主要升级版…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…

GitHub多人协作简明教程

本文面向已经了解/熟悉git基本命令但是并不熟悉如何使用GitHub进行多人协作开发项目的同学。 为了简单起见&#xff0c;这里假设只有两个开发人员&#xff0c;HuanianLi 和 DaxiangLi。他们在GitHub上的地址和角色为&#xff1a; HuanianLi: https://github.com/huanianli # M…

2020地区mysql表_2020年甘肃省军队文职考试职位表下载:张掖地区招13人

2020年6月15日全军面向社会招考文职人员公告已发布&#xff0c;全国招聘27073人&#xff0c;甘肃省招聘370人&#xff0c;其中张掖地区总共招聘13人。此次考试博士招考岗位报名时间为2020年6月17日至21日&#xff0c;其他招考岗位报名时间为7月1日至10日。考试时间为2020年8月2…

superhot预告片下载_预告片:裸指关节SOA

superhot预告片下载我正在研究这个想法&#xff0c;但我不知道它是否对你们有吸引力。 我想就您是否需要进一步探讨提出您的意见。 这是一笔交易&#xff1a;我遇到了一些团队&#xff0c;这些团队在使用SOA技术时由于其工具的绝对复杂性而陷入泥潭。 我只在Java中看到过这种情…

多少秒算长镜头_下中国象棋,能算多少步才算高手?

下象棋&#xff0c;你能算多少步&#xff1f;这是一个让初学者很困扰&#xff0c;也很感兴趣的话题。 很多象棋爱好者说&#xff1a;我最多看2步&#xff0c;我觉得能看5步以上的&#xff0c;就是超级高手高手高高手了。 但一代象棋宗师、14届全国冠军胡荣华的看法则颇有“玄学…

对基于消息队列的Activiti异步执行器进行基准测试

一点历史 永不停息​​的一件事是&#xff0c;Activiti如何以惊人的规模在一些大型组织中使用。 过去&#xff0c;这导致了各种优化和重构&#xff0c;其中包括异步执行器-替换旧的作业执行器。 对于未启动的用户&#xff1a;这些执行器在流程实例中处理计时器和异步继续。 特别…