hduoj 1251 統計難題

http://acm.hdu.edu.cn/showproblem.php?pid=1251php

 

統計難題

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


ios

Problem Description
Ignatius最近遇到一個難題,老師交給他不少單詞(只有小寫字母組成,不會有重複的單詞出現),如今老師要他統計出以某個字符串爲前綴的單詞數量(單詞自己也是本身的前綴).
 

 

Input
輸入數據的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們表明的是老師交給Ignatius統計的單詞,一個空行表明單詞表的結束.第二部分是一連串的提問,每行一個提問,每一個提問都是一個字符串.

注意:本題只有一組測試數據,處理到文件結束.
 

 

Output
對於每一個提問,給出以該字符串爲前綴的單詞的數量.
 

 

Sample Input
 
banana
band
bee
absolute
acm
 
 
ba
b
band
abc
 

 

Sample Output
2
3
1
0
 
分析:
 
字典樹。
 
 
 
AC代碼:
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 #include<string>
 7 #include<cmath>
 8 using namespace std;
 9 char ss[1010][1010];
10 #define MAX 27
11 struct  trie
12 {
13     trie *next[MAX];
14     int  v;
15     trie()
16     {
17         int i;
18         v=0;
19         for(i=0; i<26; i++) next[i]=NULL;
20     }
21 };
22 trie *p,*q;
23 void creattrie(char *str,trie *root)
24 {
25     int len = strlen(str);
26     p = root;
27     for(int i=0;i<len; i++)
28     {
29         int id = str[i] - 'a';
30         if(p->next[id] == NULL)
31         {
32             q=new trie;
33             q->v = 1;
34             p->next[id] = q;
35             p=q;
36         }
37         else
38         {
39             p=p->next[id];
40             p->v+=1;
41         }
42     }
43 }
44 int findtrie(char *str,trie *root)
45 {
46     int i;
47     int len = strlen(str);
48     p = root;
49     for(i=0;i<len;i++)
50     {
51         int id = str[i] - 'a';
52         p=p->next[id];
53         if(p->v == 1)
54         {
55             return i+1;
56         }
57     }
58 }
59 int main()
60 {
61 int T,n,ans;
62 scanf("%d",&T);
63 while(T--)
64 {
65     ans = 0;
66     trie *root = new trie;
67     scanf("%d",&n);
68     //getchar();
69     for(int i=0;i<n;i++)
70     {
71         scanf("%s", ss[i]);//用gets接收會有WA
72         creattrie(ss[i],root);
73     }
74     for(int i=0;i<n;i++)
75     {
76         int kk = findtrie(ss[i],root);
77         ans = ans+kk;
78     }
79     printf("%d\n",ans);
80 }
81   return 0;
82 }
相關文章
相關標籤/搜索