字典树 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,一经查实,立即删除!

相关文章

jaxb需要jar包吗_JAXB –不需要注释

jaxb需要jar包吗似乎有一个误解&#xff0c;认为在模型上需要注释才能使用JAXB&#xff08;JSR-222&#xff09;实现。 事实是&#xff0c;JAXB是例外配置&#xff0c;因此仅当您要覆盖默认行为时才需要注释。 在此示例中&#xff0c;我将演示如何在不提供任何元数据的情况下使…

MATLAB均值和标准差

mean(); %均值std(); %标准差

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;以区别不同的…

MATLAB判断奇偶数

if mod(n,2)%偶数else%奇数

从percona server 5.7换到mariadb 10.2

过去两年半一直推荐使用percona server&#xff0c;今天开始&#xff0c;因为一些mysql迟迟不不愿意支持的特性&#xff0c;打算换回mariadb 10.2了&#xff0c;具体哪些不说了&#xff0c;总之非常关键&#xff0c;mariadb都支持一两年了&#xff0c;oracle公司因为oracle的原…

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…

MATLAB求解非线性方程组

function F fun(x)x1 x(1); x2 x(2);F [2*x13*x2-3;3*x12*x2-5];>>fsolve(fun,[0,0])如果有变系数如下&#xff1a; function F fun(x,a,b)x1 x(1); x2 x(2);F [a(1)*x1b(1)*x2-3;a(2)*x1b(2)*x2-5];>>fsolve(fun,[0,0],[],a,b);%中间加一个[],后面传参数即…

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…

MATLAB数值取整

fix(x);%截尾取整&#xff0c;下取整floor(x);%高斯取整&#xff0c;不超过x的最大整数ceil(x);%大于x的最小整数&#xff0c;上取整round(x);%四舍五入取整

Tomcat权威指南-读书摘要系列6

6. Tomcat 安全防护 使用SecurityManager 在Tomcat中&#xff0c;决定安全策略的配置文件是$CATALINA_HOME/conf/catalina.policy&#xff0c;在用-security选项调用Tomcat的时候&#xff0c;JVM读取这一文件。以安全模式启动Tomcat.\catalina.bat start -security 安全漏洞 Cr…

MATLAB找波峰波谷

全局波峰波谷&#xff1a;max();min();所有波峰波谷&#xff1a;findpeaks();pks findpeaks(data) [pks,locs] findpeaks(data) ------pks 对应峰值&#xff0c;locs 对应峰值位数 [...] findpeaks(data,minpeakheight,mph)----mph 设定峰值的最小高度 [...] findpeaks(dat…

chrome 浏览器全屏操作

chrome.exe -kiosk [网页]转载于:https://www.cnblogs.com/yang95/articles/9335975.html

java锁实现_Java锁实现

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

2023年12月青少年机器人技术等级考试(五级) 实操试卷

主题&#xff1a;按键控制心形图案交互显示 器件&#xff1a;ESP32主控板1块&#xff0c;按键模块1个&#xff0c;8x8LED点阵1个&#xff0c;74HC595移位寄存器芯片&#xff08;或模块&#xff09;及相应辅件。以上模块也可使用分立器件结合面包板搭建。 任务要求&#xff1a; …

MATLAB正太分布函数

normcdf(x); %标准正态分布的分布函数。 normcdf(x,mu,sigma); %带平均值和方差μ和σ的正态分布&#xff0c;标准正态分布就是mu0,sigma1的特例。%例如>> normcdf(0,0,1)ans 0.5>> normcdf(inf,0,1)ans 1>> normcdf(-inf,0,1)ans 0

编写自己的工具箱 (一)

仔细想了一下 决定先解决一下调用的问题&#xff0c; 这样无比要解决异步获取 !function(){var requireOption window.requireOption || {path : ,};var windowIsLoad false;var key setInterval(function(){if( document.body || windowIsLoad ){windowIsLoad true;clearI…