很棒 HDU 1251 (字典树)

来源:互联网 发布:换声音的软件 编辑:程序博客网 时间:2024/05/16 13:47

分析:一道简单的字典树的题目,一开始用G++提交总是MLE  ,尝试再写个释放内存的函数,竟然比原先的内存占用更大了。很无语。。。。后来改用C++提交竟然减少了一半内存,而且AC了。!!

#include <stdio.h>#include <string.h>#include <stdlib.h>#define  MAX 50021typedef struct trie{     trie *next[26]; int v;    //字符相同的个数}trie;trie *root;void creat_trie(char str[]){    int len = strlen(str);    trie *p = root;    for(int i=0; i<len; ++i)    {        int id = str[i]-'a';        if(p->next[id] == NULL)        {            p->next[id] = (trie *)malloc(sizeof(trie));            p->next[id]->v = 1;                      p = p->next[id];for(int j=0; j<26; ++j)                p->next[j] = NULL;        }        else        {            p->next[id]->v++;            p = p->next[id];        }    }}int find_trie(char str[]){    int len = strlen(str);trie *pp = root;for (int i=0;i<len;i++){int id = str[i] - 'a';pp = pp->next[id];if(pp == NULL)return 0;       //没有符合}return pp->v;  // 此字符串为字符集中某串的前缀}int main(){int N,n,i,j,s,t,m,flag=0;int a,b,c,d;int sum;char str[15];root = (trie *)malloc(sizeof(trie));for (i=0;i<26;i++){root->next[i] = NULL;}while (gets(str) && str[0] != 0){creat_trie(str);}while (scanf("%s",str) != EOF){int k=find_trie(str);printf("%d\n",k);}//deal(root);return 0;}

代码2:

#include <cstdio>#include <cstring>#include <iostream>using namespace std;struct trie{     trie *next[26]; int v;    //字符相同的个数 trie() { memset(next,NULL,sizeof(next)); v=0; }};trie *root=new trie(),*p;void creat_trie(char *str){    int i,id;    for(p = root,i=0;str[i]; ++i)    {        id = str[i]-'a';        if(p->next[id] == NULL)        {            p->next[id] = new trie();        }p = p->next[id];p->v++;}}int find_trie(char *str){int i,id;for (p=root,i=0;str[i];i++){id = str[i] - 'a';p = p->next[id];if(p == NULL)return 0;}return p->v;  // 此字符串为字符集中某串的前缀}int main(){int N,n,i,j,s,t,m,flag=0;int a,b,c,d;int sum;char str[15];while (gets(str),*str){creat_trie(str);}while (gets(str)){printf("%d\n",find_trie(str));}return 0;}


统计难题

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


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

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

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

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

Sample Input
bananabandbeeabsoluteacmbabbandabc

Sample Output
2310

Author
Ignatius.L


0 0
原创粉丝点击