#include<stdio.h>
#include<string.h>
#define MAXN 1000005
int ch[MAXN][26];
int val[MAXN];
int sz;
void ini() {sz=1;memset(ch[0],0,sizeof(ch[0]));}
int getid(char c) {return c-'a';}
void insert(char *s)
{
int len=strlen(s),i;
int pre=0,next;
for(i=0;i<len;i++)
{
int id=getid(s[i]);
next=ch[pre][id];
if(!next)
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[pre][id]=sz;
next=sz++;
}
val[next]++;
pre=next;
}
}
int query(char *s)
{
int len=strlen(s),i;
int pre=0,next;
for(i=0;i<len;i++)
{
int id=getid(s[i]);
next=ch[pre][id];
if(!next) return 0;
pre=next;
}
return val[pre];
}
char s[12];
int main()
{
ini();
while(gets(s)&&strlen(s))
{
insert(s);
}
while(gets(s))
{
printf("%d\n",query(s));
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
node *next[26];//儿子结点
int val;//数据域
};
node *root;
int getid(char c) {return c-'a';}
//插入一个字符串
void insert(char *s)
{
int len=strlen(s),i;
node *pre=root,*next;
for(i=0;i<len;i++){
int id=getid(s[i]);
next=pre->next[id];//获取儿子结点
if(!next)//为空
{
next=(node*)malloc(sizeof(node));
memset(next,0,sizeof(node));
pre->next[id]=next;
}
next->val++;//更新数据域
pre=next;//更新父亲结点
}
}
int query(char *s)
{
int len=strlen(s),i;
node *pre=root,*next;
for(i=0;i<len;i++)
{
int id=getid(s[i]);
next=pre->next[id];
if(!next) return 0;
pre=next;
}
return pre->val;
}
char s[12];
int main()
{
root=(node*)malloc(sizeof(node));
memset(root,0,sizeof(node));
while(gets(s)&&strlen(s))
{
insert(s);
}
while(gets(s))
{
printf("%d\n",query(s));
}
return 0;
}