Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
注意:本题只有一组测试数据,处理到文件结束.
banana band bee absolute acm ba b band abc
2 3 1 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
struct node{
int count;//记录前缀出现的次数
struct node * next[26];
int exist;
};
typedef struct node* Tree;
Tree root;
Tree creatNode(){//创建新的结点
Tree node =(Tree)malloc(sizeof(struct node));
node->count=0;
node->exist=0;
memset(node->next,NULL,sizeof(node->next));
return node;
}
void Insert(char * word){//插入新单词
Tree node=root;
int len=strlen(word);
for(int i=0;i<len;i++){
int id=word[i]-'a';
if(node->next[id]==NULL){
node->next[id]=creatNode();
}
node=node->next[id];
node->count+=1;
}
node->exist=1;
}
int Find(char *str){//寻找前缀出现的次数
int len=strlen(str);
Tree p=root;
for(int i=0;i<len;i++){
int id=str[i]-'a';
p=p->next[id];
if(p==NULL) return 0;
}
return p->count;
}
int main(){
char str[15];
root=creatNode();
while(gets(str)&&str[0]!='\0'){
Insert(str);
}
while(cin>>str){
int ans=Find(str);
cout<<ans<<endl;
}
return 0;
}