大四了,Leyni感觉好惆怅,因为找不到工作,所以最后决定考研了,可是Leyni的英语好差,没办法,先从最基本的背单词开始吧。那么多单词怎么才好背呢,话说考研界盛传利用前缀背单词,貌似好神奇的样子。因为英语单词很多,Leyni想要知道以一个特定字符串做前缀的单词有多少,于是他来找你帮忙了。 |
Input |
输入首先包含若干行小写单词,表示字典里的单词,以END结束,然后是若干个询问字符串,表示单词的前缀。输入到文件结束。最多不超过50000个单词。每个单词长度不超过15。 |
Output |
对于每一个询问字符串,每行输出一个整数,表示单词表里有多少单词以此字符串作为前缀。 |
Sample Input |
a ab aba abcaa END aba a ab abcd |
Sample Output |
1 4 3 0 |
#include<stdio.h>
#include<string.h>struct trie{
int cnt;
trie *next[26];
};
trie *root=new trie;
void insert(char ch[]){
trie *p=root,*newnode;
for(int i=0;ch[i]!='\0';i++){
if(p->next[ch[i]-'a']==0){
newnode=new trie;
for(int j=0;j!=26;j++){
newnode->next[j]=NULL;
}
newnode->cnt=1;
p->next[ch[i]-'a']=newnode;
p=newnode;
}else{
p=p->next[ch[i]-'a'];
p->cnt++;
}
}
}
int find(char ch[]){
trie *p=root;
for(int i=0;ch[i]!='\0';i++){
if(p->next[ch[i]-'a']!=NULL)
p=p->next[ch[i]-'a'];
else
return 0;
}
return p->cnt;
}
int main(){
char ch[20];
for(int i=0;i!=26;i++){
root->next[i]=NULL;
}
root->cnt=0;
while(gets(ch)){//±ØÐëÓÃgets
if(!strcmp(ch,"END")) break;
insert(ch);
}
while(scanf("%s",ch)!=EOF){
printf("%d\n",find(ch));
}
return 0;
}