HDU--1251 -- 统计难题 [字典树基本应用] [用数组事先分配空间以节约时间]

来源:互联网 发布:遗传算法优化svm参数 编辑:程序博客网 时间:2024/06/01 15:51

 

统计难题

 

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 13656    Accepted Submission(s): 5858

Problem Description

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

 
 Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 Sample Input
bananabandbeeabsoluteacmbabbandabc
 Sample Output
2310

 

 

Code:

 

啦啦啦~尝试了一下用数组事先分配空间, 比malloc快好多呢

&符号又加深了理解~~

完胜~~O(∩_∩)O哈哈~

#include"stdio.h"#include"string.h"#include"iostream"#define null 0using namespace std;typedef struct trie{int count;trie *child[26];}trie_node;trie_node memory[1000000];int index = 1;trie_node *tree;void trie_insert(char c[]){int i,j;trie_node *p;p = tree;for(i=0;i<strlen(c);i++){if(p->child[c[i]-'a']){p->child[c[i]-'a']->count++;p = p->child[c[i]-'a'];}else{p->child[c[i]-'a'] = &memory[index++];p->child[c[i]-'a']->count=1;for(j=0;j<26;j++)p->child[c[i]-'a']->child[i] = NULL;p = p->child[c[i]-'a'];}}}int trie_count(char c[]){trie_node *p;p = &memory[1];int i,j,count=0;for(i=0;i<strlen(c);i++){if(!p->child[c[i]-'a']) return 0;else{count = p->child[c[i]-'a']->count;p = p->child[c[i]-'a'];}}return count;}int main(){int i;char str[11];tree = &memory[index++];tree->count=0;for(i=0;i<26;i++)tree->child[i] = NULL;while(gets(str),strcmp(str,""))trie_insert(str);//printf("~~~~~\n");while(gets(str))printf("%d\n",trie_count(str));return 0;}
原创粉丝点击