Description
Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字符串爲前綴的單詞數量(單詞本身也是自己的前綴).
Input
輸入數據的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們代表的是老師交給Ignatius統計的單詞,一個空行代表單詞表的結束.第二部分是一連串的提問,每行一個提問,每個提問都是一個字符串.
注意:本題只有一組測試數據,處理到文件結束.
注意:本題只有一組測試數據,處理到文件結束.
Output
對於每個提問,給出以該字符串爲前綴的單詞的數量.
Sample Input
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
2
3
1
0
根據這道純字典樹的題來了解字典樹的基本模板,以下爲ac代碼
#include<stdio.h>
#include<string.h>
struct Node
{
Node *next[26];//每個節點的分支由單詞性質決定,這裏是小寫的26個字母
int cnt;//每個節點可以保存一些信息,這道題是保存該前綴的數量
Node()
{
for(int i=0;i<26;i++) next[i]=NULL;
cnt=0;
}
};
Node root;
void insert(char *str)
{
Node *p=&root,*q;
int len=strlen(str);
int id;
for(int i=0;i<len;i++)
{
id=str[i]-'a';
if(p->next[id]==NULL)
{
q=new Node;
q->cnt++;
p->next[id]=q;
p=q;
}
else
{
p=p->next[id];
p->cnt++;
}
}
}
int find(char *str)
{
int len=strlen(str);
Node *p=&root;
int id;
for(int i=0;i<len;i++)
{
id=str[i]-'a';
if(p->next[id]!=NULL) p=p->next[id];
else return 0;
}
return p->cnt;
}
int main()
{
char str[11];
if(gets(str)==NULL) return 0; //gets讀取EOF時返回值爲NULL
while(str[0]!='\0')//用gets就可以讀取到‘\n’,此時轉換爲'\0'
{
insert(str);
gets(str);
}
while(scanf("%s",str)!=EOF)
{
printf("%d\n",find(str));
}
return 0;
}