HDU-1251 统计难题(字典树+map)
2016-07-29 10:48
399 查看
J - 统计难题
Time Limit:2000MS Memory Limit:65535KB 64bit IO Format:%I64d
& %I64u
Submit Status
Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
2
3
1
0
字典树模板题,这里套用一位大神的模板
Time Limit:2000MS Memory Limit:65535KB 64bit IO Format:%I64d
& %I64u
Submit Status
Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
2
3
1
0
字典树模板题,这里套用一位大神的模板
#include <cstdio> #include <cstring> #include <malloc.h> #include <iostream> using namespace std; #define MAXN 26 typedef struct Trie { int v;//根据需要变化 Trie *next[MAXN]; //next是表示每层有多少种类的数,如果只是小写字母,则26即可, //若改为大小写字母,则是52,若再加上数字,则是62了 }Trie; Trie root; void createTrie(char *str) { int len = strlen(str); Trie *p = &root, *q; for(int i = 0; i < len; i++) { int id = str[i]-'a'; if(p->next[id] == NULL) { q = (Trie *)malloc(sizeof(root)); q->v = 1;//初始v==1 for(int j = 0; j < MAXN; j++) q->next[j] = NULL; p->next[id] = q; p = p->next[id]; } else { p->next[id]->v++; p = p->next[id]; } } // p->v = -1;//若为结尾,则将v改成-1表示 } int findTrie(char *str) { int len = strlen(str); Trie *p = &root; for(int i = 0; i < len; i++) { int id = str[i]-'a'; p = p->next[id]; if(p == NULL) //若为空集,表示不存以此为前缀的串 return 0; // if(p->v == -1) //字符集中已有串是此串的前缀 // return -1; } return p->v; //return -1; //此串是字符集中某串的前缀 } int dealTrie(Trie* T) { //动态字典树,有时会超内存,这是就要记得释放空间了 if(T==NULL) return 0; for(int i = 0; i < MAXN; i++) { if(T->next[i]!=NULL) dealTrie(T->next[i]); } free(T); return 0; } int main() { char str[15]; for(int i = 0; i < MAXN; i++) root.next[i] = NULL; while(gets(str) && str[0]!='\0') createTrie(str); memset(str, 0, sizeof(str)); while(scanf("%s", str) != EOF) { int ans = findTrie(str); printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU_1251 统计难题 【字典树||map】
- hdu 1251-统计难题(字典树||map||数组)
- 【HDU】1251 - 统计难题(字典树 || STL - map & string)
- HDU-1251 统计难题,字典树或者map!
- HDU 1251 (统计难题) 字典树模板&&map实现
- HDU 1251 统计难题(字典树,map)
- HDU-1251-统计难题(字典树||map)
- HDU 1251:统计难题【字典树 & string+map】
- HDU 1251 统计难题(字典树(统计前缀数量) || map运用)
- HDU--1251 -- 统计难题 [字典树基本应用] [用数组事先分配空间以节约时间]
- HDU 1251统计难题(字典树)
- hdu 1251 统计难题(字典树)
- hdu 1251 统计难题(字典树)
- hdu 1251 统计难题(字典树模版)
- hdu 1251 统计难题< map<string,int> >
- hdu 题目1251 统计难题 (字典树)
- hdu 1251 统计难题 字典树
- HDU 1251 统计难题(字典树,统计前缀个数)
- HDU 1251 统计难题(字典树)
- 统计难题 hdu 1251 字典树