hdu1251统计难题(trie)

统计难题

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

Problem Description

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

Input

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

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

Output

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

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0

Author

Ignatius.L

 1 #include<cstdio>
 2 #include<cstring>
 3 const int MAXN = 1000100;
 4
 5 struct Trie
 6 {
 7     int ch[MAXN][26];
 8     int val[MAXN];
 9     int size;//节点总数
10     void Clear()
11     {
12         size = 1;
13         memset(ch[0],0,sizeof(ch[0]));
14         memset(val,0,sizeof(val));
15     }
16     int idx(char c)
17     {
18         return c - ‘a‘;   //字符c的编号
19     }
20     void Insert(const char*s)
21     {
22         int u = 0, len = strlen(s);
23         for (int i=0; i<len; ++i)
24         {
25             int c = idx(s[i]);
26             if (!ch[u][c])
27             {
28                 memset(ch[size],0,sizeof(ch[size]));
29                 ch[u][c] = size++;
30             }
31             u = ch[u][c];
32             val[u]++;
33         }
34     }
35     int Find(const char* s)
36     {
37         int u = 0 , len = strlen(s);
38         for (int i=0; i<len-1; ++i)
39         {
40             int c = idx(s[i]);
41             if (!ch[u][c]) return 0 ;
42             u = ch[u][c];
43         }
44         int c = idx(s[len-1]);
45         return val[ch[u][c]] ;
46     }
47 }t;
48
49 int main()
50 {
51     char word[15];
52     t.Clear();
53     while (gets(word)&&strcmp(word,""))
54     {
55         t.Insert(word);
56     }
57     while (scanf("%s",word)!=EOF)
58         printf("%d\n",t.Find(word));
59     return 0;
60 }
时间: 2024-10-24 02:18:43

hdu1251统计难题(trie)的相关文章

[hdu1251]统计难题(trie模板题)

题意:返回字典中所有以测试串为前缀的字符串总数. 解题关键:trie模板题,由AC自动机的板子稍加改造而来. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; typedef long

HDU1251统计难题---Trie Tree

map巧过 #include <stdio.h> #include <string.h> #include <map> #include <string> using namespace std; map<string,int>m1; int main() { char z[10]; while(gets(z)) { if(strlen(z)==0) break; for(int i=strlen(z);i>0;i--) { z[i]='\

HDU1251 统计难题 【trie树】

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 17302    Accepted Submission(s): 7464 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

HDU 1251 统计难题 Trie题解

基本上是标准的寻找前缀的问题,只需要insert和search函数就可以了. 我这里主要是修改一下n的记录方法,这里的n代表的不是叶子节点的标志,而是有多少单词经过了这条路径的标志. 然后是查找需要查找的前缀单词,如果没有找到,就返回0,表示没有单词以这个前缀单词为前缀,如果找到,直接返回n就是答案了.因为有n个单词经过了这条路径. 查找效率是常数. 使用静态分配空间的办法. #include <stdio.h> #include <string.h> const int MAX_

hdu1251(统计难题)

这题就是一个字典树的模板题 统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 16997    Accepted Submission(s): 7318 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的

HDU1251 统计难题(Trie)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 26574    Accepted Submission(s): 10760 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己

HDU-1251 统计难题(Trie、AC自动机)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 44119    Accepted Submission(s): 15817 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

hdu1251 统计难题

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1251 题目: 统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 35141    Accepted Submission(s): 13175 Problem Description Ignatius最近遇到一个难题,老师交给

HDU 1251 统计难题(trie简单应用)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 25579    Accepted Submission(s): 10451 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的