统计前缀,模板的字典树~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
struct node{
int cnt;
node *next[26];
}*root;
node *build()
{
node *p=(node *)malloc(sizeof(node));
for(int i=0;i<26;i++)
p->next[i]=NULL;
p->cnt=1;//初始化应该是1。。
return p;
}
void insert(char *word)//构造字典树
{
int len=strlen(word);
node *p;
p=root;
for(int i=0;i<len;i++)
{
if(p->next[word[i]-'a']==NULL)
p->next[word[i]-'a']=build();
else p->next[word[i]-'a']->cnt++;//计数
//printf("cnt%d\n",p->next[word[i]-'a']->cnt);
p=p->next[word[i]-'a'];
}
}
int query(char *ask)
{
int ans=0;
int len=strlen(ask);
node *p;
p=root;
for(int i=0;i<len;i++)
{
if(!(p->next[ask[i]-'a']))
return 0;
ans=p->next[ask[i]-'a']->cnt;
p=p->next[ask[i]-'a'];
}
return ans;
}
int main()
{
char word[15],ask[15];
root=build();
while(gets(word)&&word[0])//.........跪在输入上,gets是可以有空格的,scanf不可以
{
insert(word);
}
while(scanf("%s",ask)!=EOF)
{
printf("%d\n",query(ask));
}
return 0;
}