数据结构-hihocoder 1014的相关问题

问题描述

hihocoder 1014的相关问题

大家好,想请教大家关于hihocoder 1014的相关问题
问题描述:
/*时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。

这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?”

身经百战的小Ho答道:“怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的所有单词,检查你给我的字符串是不是这个单词的前缀不就是了?”

小Hi笑道:“你啊,还是太年轻了!~假设这本词典里有10万个单词,我询问你一万次,你得要算到哪年哪月去?”

小Ho低头算了一算,看着那一堆堆的0,顿时感觉自己这辈子都要花在上面了...

小Hi看着小Ho的囧样,也是继续笑道:“让我来提高一下你的知识水平吧~你知道树这样一种数据结构么?”

小Ho想了想,说道:“知道~它是一种基础的数据结构,就像这里说的一样!”

小Hi满意的点了点头,说道:“那你知道我怎么样用一棵树来表示整个词典么?”

小Ho摇摇头表示自己不清楚。

提示一:Trie树的建立

“你看,我们现在得到了这样一棵树,那么你看,如果我给你一个字符串ap,你要怎么找到所有以ap开头的单词呢?”小Hi又开始考校小Ho。

“唔...一个个遍历所有的单词?”小Ho还是不忘自己最开始提出来的算法。

“笨!这棵树难道就白构建了!”小Hi教训完小Ho,继续道:“看好了!”

提示二:如何使用Trie树

提示三:在建立Trie树时同时进行统计!

“那么现在!赶紧去用代码实现吧!”小Hi如是说道

输入
输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。

在20%的数据中n, m<=10,词典的字母表大小<=2.

在60%的数据中n, m<=1000,词典的字母表大小<=5.

在100%的数据中n, m<=100000,词典的字母表大小<=26.

本题按通过的数据量排名哦~

输出
对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

样例输入
5
babaab
babbbaaaa
abba
aaaaabaa
babaababb
5
babb
baabaaa
bab
bb
bbabbaab
样例输出
1
0
3
0
0*/

我的代码:
#include
#include

struct trie
{
int num;
struct trie *data[26];
}*p;

void trie1(struct trie *x)

{

int i;
x->num = 0;

for(i = 0; i < 26; i++)

x->data[i] = NULL;

}

void insertTrie(char s[])
{
int i;
trie1(p);
p->num++;
for(i=0;s[i];i++)
{
int j = s[i] - 'a';
if(p->data[j] == NULL)
{
p->data[j] = (struct trie *)malloc(sizeof(struct trie));
trie1(p->data[j]);
}

p = p->data[j];
p->num++;
}
}

int searchTrie(char s[])
{
int i;
//struct trie *q = root ;
//trie1(p);
for(i = 0; p&&s[i]; i++)
{
int j = s[i] - 'a';
p = p->data[j];
}
if(!p) return 0;
else return p->num;
}

int main()
{
char s[12];
int n, m;
while(~scanf("%d", &n))
{
//root = (struct Trie *)malloc(sizeof(struct trie));
while(n--)
{
scanf("%s", s);
insertTrie(s);
}
scanf("%d", &m);
while(m--)
{
scanf("%s", s);
printf("%dn", searchTrie(s));
}
}
return 0;
}

不知道有什么问题啊,但是运行出错,希望各位大神帮我看看,谢谢!

解决方案

http://blog.csdn.net/zhouyelihua/article/details/44975791

解决方案二:

各位,我已经解决了,代码如下:
#include
#include

struct trie
{
int num;
struct trie *next[26];
}*root;

void initial_trie(struct trie *q)
{
int i = 0;
q->num = 0;
for(i = 0; i < 26; i++)
{
q->next[i] = NULL;
}
}

void insertTrie(char s[])
{
int i, j;
struct trie *p = root ;

p->num++;
for(i=0;s[i];i++)
{
    j = s[i] - 'a';
    if(p->next[j] == NULL)
    {
        p->next[j] = (struct trie *)malloc(sizeof(struct trie));
        initial_trie(p->next[j]);
    }
    p = p->next[j];
    p->num++;
}

}

int searchTrie(char s[])
{
int i;
struct trie *p = root ;
for(i = 0; p && s[i]; ++i)

{

int j = s[i] - 'a';
p = p->next[j];

}

if(!p) return 0;

else return p->num;
}

int main()
{
char s[12];
int n, m;

while(scanf("%d", &n))
{
root = (struct trie *)malloc(sizeof(struct trie));
initial_trie(root);

while(n--)
{
  scanf("%s", s);
  insertTrie(s);
}
scanf("%d", &m);
while(m--)
{
  scanf("%s", s);
  printf("%dn", searchTrie(s));
}

}
return 0;
}

但是新问题是:超出了hihocoder规定的时间,各位有没有好的方法优化代码。。。

时间: 2024-09-20 05:38:21

数据结构-hihocoder 1014的相关问题的相关文章

浅谈算法和数据结构 十二 无向图相关算法基础

从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记. 图的应用很广泛,也有很多非常有用的算法,当然也有很多待解决的问题,根据性质,图可以分为无向图和有向图.本文先介绍无向图,后文再介绍有向图. 之所以要研究图,是因为图在生活中应用比较广泛: 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的.边仅由两个顶点连接,并且没有方向的图称为无向图. 在研究图之前,有一些定义需要明确,下图中表示了图的一些基本属性的含义,这里就不多说明. 图的

Python中的高级数据结构详解_python

数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择,例如Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint.本文将介绍这些数据结构的用法,看看它们是如何帮助我们的应用程序的. 关于四种内建数据结构的使用方

数组在Java编程中的应用

序 数组是很重要的数据结构,由同一类型相关的数据结构组成是静态实体,有链 表,队列,堆栈,数等数据结构,java还提出了类数组的类vector.这些都是java数 据结构的组成部分,正如我们学过的c语言版的数据结构,java数据结构也是来描 述数据结构的只是描述语言是java一样而已. 1.数组中最重要的是数组下标,数组下标及数组名是用来给访问者提供访问 数组的途径,数据下标从0开始,c[0],就是一个第一个数据第一个元素是c[i- 1],数组名的名名规则与变量相同,其访问格式也很简单. 例:c

linux 进程(一)---基本概念

一.进程的定义         进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程.   二.进程与程序的区别          程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念.     进程是一个动态的概念,它是程序执行的过程,包括创建.调度和消亡.   三.linux系统中进程的表示       在linux系统中,进程由一个叫task_struct的结构体描述,

《Linux系统编程(第2版)》——2.11 内核内幕

2.11 内核内幕 这一节将介绍Linux内核如何实现I/O,重点说明内核的三个主要的子系统:虚拟文件系统(VFS).页缓存(page cache)和页回写(page writeback).通过这些子系统间的协作,Linux I/O看起来无缝运行且更加高效. 2.11.1 虚拟文件系统 虚拟文件系统,有时也称虚拟文件交换(virtual file switch),是一种抽象机制,支持Linux内核在不了解(甚至不需要了解)文件系统类型的情况下,调用文件系统函数并操作文件系统的数据. 虚拟文件系统

Glib编程

                                          Glib 编程           GLib是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事件循环.线程.动态调用.对象系统等的API.它能够在类UNIX的操作系统平台(如LINUX, HP-UNIX等),WINDOWS,OS2和BeOS等操作系统台上运行. GLib需要一

c语言程序设计-一个c语言思考题。想了好久了

问题描述 一个c语言思考题.想了好久了 条件.只用if,switch和输入输出.做一个3个数的混合运算(带括号).提示.用到scanf的返回值. 如我输入(1+2)*3 输出9 我输入1+2*3输出7 解决方案 你这相当于编一个计算器.网上很多例子.http://jingyan.baidu.com/article/22fe7ced67cd443002617f98.html 解决方案二: 不知道,哈哈真的不知道 解决方案三: 括号的话要借助栈啊,代数计算器,要做完善还是挺麻烦的 解决方案四: 这个

KCon 2017黑客大会实录:那些年轻黑客是如何成长的?

本文讲的是KCon 2017黑客大会实录:那些年轻黑客是如何成长的?,不知不觉间,知道创宇主办的KCon黑客大会已经第六届了. 今年KCon放在北京中关村时尚产业创新园里的北京服装学院举行,对众多参会者来说,它是一个相对新鲜的地方.过往安全会议要么在国家会议中心,要么在高档星级酒店,已经成为套路. 这也和KCon的业内形象类似.国内安全大会现在形成几个流派,ISS.CSS.ISC等展示主办方安全生态力量的权利大会:XCon.MOSEC.SyScan360等硬核技术会议:GeekPwn.XPwn等

在OpenCASCADE使用包SortTools中的排序功能

Use the Sort Function in the Package SortTools of the Toolkit TKernel eryar@163.com China 在OpenCASCADE的Toolkit TKernel中有个排序包(Package SortTools),可以对整数和实数进行排序.排序方法有四种:堆排序.快速排序.希尔排序.直接插入排序.这几种排序方法都是静态方法,因此,可以用对象名调用,这时,将静态方法看作是某个名空间的一个函数.排序包中对应几种排序方法的几个类