博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 1109 zoj 1109 Language of FatMouse(字典树)
阅读量:4965 次
发布时间:2019-06-12

本文共 3221 字,大约阅读时间需要 10 分钟。

好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组。完全按照自己按照自己的想法打的,没有参考如何被人的代码。调试了一天,居然最后错在一个小问题上,郁闷啊!!!最后终于调试出来了!!一次提交就ac了!!开心溢于言表啊!!!!!!

/*trie树:插入:    插入一段字符串:        每个字符作为树的一层(同一层的节点通过兄弟节点项连),每个节点如果有后继节点的话,就把最大的后继放到其后面。        如果字符串结束,就在该节点处,connt++;然后用一个字符串指针指向实际匹配的字符串的地址。查询:    给定一个字符串,通过字符串和树遍历匹配,匹配到该字符串最后的一个节点时,就输出,字符串指针所指向的位置。*/#include
#include
#include
#define MAX 100010typedef struct T { int count;/*记录相同字符串的个数*/ struct T * Next;/*下一层排名第1节点的地址*/ struct T * borther;/*同一层比该节点排名后的兄弟*/ char *real;/*实际指向的字符串*/ char msg;/*该节点的信息*/}Node;typedef struct N{ char key[15],source[15];}Element;Element element[MAX];void create(Node *trie){ trie->count=0; trie->Next=trie->borther=NULL; trie->real=NULL;}void insert(Node *trie,int L){ int i,j,flag=0,h=0; Node *p,*s,*o,*x,*temp; s=p=trie; for(i=0;i
Next)/*如果上一层下面是空的,就把创建一个将当前的方进*/ { o=(Node *)malloc(sizeof(Node)); o->msg=element[L].key[i];/*该字符放入其中*/o->count=0; o->Next=o->borther=NULL;o->real=NULL; s->Next=p=o;;/*将当前节点更新为上一个节点*/ } else{ h=0; x=p=s->Next; while(p) { if(element[L].key[i]==p->msg){
/*如果相同,那么肯定之前存在过,就找下一层*/ h=1;break; } else if(element[L].key[i]>p->msg){
/*如果排名在他前面就停止移动*/ x=p; p=p->borther;/*如果排名比他后,往后移*/ } else { if(p==s->Next) { h=2; o=(Node *)malloc(sizeof(Node)); o->msg=element[L].key[i];/*该字符放入其中*/o->count=0; o->Next=NULL;o->real=NULL; s->Next=o;o->borther=p;p=o;/*将当前节点更新为上一个节点*/ } break; } } if(h==0) { o=(Node *)malloc(sizeof(Node)); o->msg=element[L].key[i];/*该字符放入其中*/o->count=0; o->Next=NULL;o->real=NULL; x->borther=o;o->borther=p;p=o;/*将当前节点更新为上一个节点*/ } } if(element[L].key[i+1]=='\0'){
/*找到字符串的终点就返回*/ p->real=element[L].source;p->count++; // printf("%s\n",source); return ; } s=p; }}int serch(Node *trie,char *s){ int i=0; Node *p=trie->Next; while(p) { if(p->msg==s[i]) { i++; if(s[i]=='\0') { printf("%s\n",p->real);return 1; } else { p=p->Next; } } else p=p->borther; } return 0;}int main(void){ int i,j; Node trie;/*创建一个树的根节点,没用动态创建*/ char s[2*MAX]; create(&trie);/*传递地址,初始化树的根节点的数据*/ j=0; while(gets(s)){ if(strcmp(s,"\0")==0)/*输入空行直接跳出*/ break; for(i=0;i

 

 

转载于:https://www.cnblogs.com/woshijishu3/p/3649399.html

你可能感兴趣的文章
highcharts 图表实例
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>
SpringBoot 优化内嵌的Tomcat
查看>>
【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
PL/SQL Developer 查询的数据有乱码或者where 字段名=字段值 查不出来数据
查看>>
宏定义
查看>>
笔记:git基本操作
查看>>
生成php所需要的APNS Service pem证书的步骤
查看>>
JavaWeb之JSON
查看>>
HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
查看>>
windows平台上编译mongdb-cxx-driver
查看>>
optionMenu-普通菜单使用
查看>>
MVC3分页传2参
查看>>
2016-2017-2点集拓扑作业[本科生上课时]讲解视频
查看>>
appium(13)- server config
查看>>
IIS负载均衡-Application Request Route详解第六篇:使用失败请求跟踪规则来诊断ARR...
查看>>
管理信息系统 第三部分 作业
查看>>