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

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

zoj 1109 zoj 1109 Language of FatMouse(字典树)的更多相关文章

  1. zoj 1109 Language of FatMouse(字典树)

    Language of FatMouse Time Limit: 10 Seconds      Memory Limit: 32768 KB We all know that FatMouse do ...

  2. ZOJ 3674 Search in the Wiki(字典树 + map + vector)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4917 题意:每一个单词都一些tips单词. 先输入n个单词和他们的t ...

  3. zoj 1109 Language of FatMouse(map映照容器的典型应用)

    题目连接: acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1109 题目描述: We all know that FatMouse doe ...

  4. zoj 1109 Language of FatMouse(map)

    Language of FatMouse Time Limit: 10 Seconds      Memory Limit: 32768 KB We all know that FatMouse do ...

  5. ZOJ 1109 Language of FatMouse

    较简单字典树,每输入一对字符串,前一个放在字典(数组)中,后一个插入字典树中,并将其最终的flag赋为前一个在数组中的下标,再就好找了.输入的处理方法要注意一下. 代码: #include <i ...

  6. zoj1109 水题(大神绕道) Language of FatMouse

    Language of FatMouse Time Limit: 10 Seconds      Memory Limit:32768 KB We all know that FatMouse doe ...

  7. zoj1109-Language of FatMouse 【字典树】

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=109 Language of FatMouse Time Limit: 10 S ...

  8. ZOJ 2706 Thermal Death of the Universe (线段树)

    题目链接:ZOJ 2706 Thermal Death of the Universe (线段树) 题意:n个数.m个操作. 每一个操作(a,b)表示(a,b)全部值更新为这个区间的平均数:1.当前的 ...

  9. poj 2503:Babelfish(字典树,经典题,字典翻译)

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 30816   Accepted: 13283 Descr ...

随机推荐

  1. PHP学习之数据库操作

    PHP数据库操作: 一.连接数据库 mysql_connect() 例:$link=mysql_connent("localhost","root"," ...

  2. GMTED2010 高程数据下载

    http://topotools.cr.usgs.gov/GMTED_viewer/viewer.htm

  3. Microsoft Azure 大计算 – 宣布收购 GreenButton

     数据以及令人不可思议的计算能力,正在改变我们日常业务的经营方式,从科学和工程到媒体和金融,各行各业的客户正逐渐意识到什么是可能的.我们对整个基因组进行分析,以研制新药物.我们构建金融和保险模型, ...

  4. 传智播客C/C++学院年薪24-50万招聘C/C++讲师

    C/C++技术讲师 6名 (北京,年薪:24-50万) 传智播客C/C++课程培训体系如下: 1.C语言,世界五百强C语言面试训练 2.C++语言,世界五百强C++语言面试训练 3.数据结构与算法,世 ...

  5. JS 网页打印解决方案

    这些日子真是太忙了,项目太多了公司总是加班,而且这些项目中好多都用到的打印,所以学习了一段时间js的打印. 其实原来只是用到了简单的功能,现在要深入的了解才发现原来ie的网页打印也是如此的强大. 以下 ...

  6. rsyslog 配置

    在Debian环境下: 1,配置文件在/etc/rsyslogd.conf下: 2,如果要增加配置,并且不想直接修改rsyslogd.conf文件,可以在/etc/rsyslog.d/目录下增加文件, ...

  7. sublime text 3解放鼠标的快捷键总结

    Sublime text 3是我最喜欢的代码编辑器,每天和代码打交道,必先利其器,掌握基本的代码编辑器的快捷键,能让你打码更有效率.刚开始可能有些生疏,只要花一两个星期坚持使用并熟悉这些常用的快捷键, ...

  8. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  9. 20141014C#面向对象抽象方法,抽象类,接口

    里氏代换原则.可以用子类的对象替代父类的对象. 抽象依赖原则.依赖——形参,关联 一.抽象方法: 在一些父类中,某些行为不是非常明确,因此无法用代码来具体实现,但是类必须具备此方法,因此把这样的方法定 ...

  10. Labview学习之远程控制VI

    Labview学习之远程控制VI        从LabVIEW 6.1开始,LabVIEW集成了Remote Panels技术,允许用户直接在客户端计算机上打开并操作位于服务器端计算机上的VI的前面 ...