注意输入格式
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1e6+10;
int trie[maxn][30],sum[maxn];
int tot,root;
char s[11];
void insert()
{
int len = strlen(s);
root = 0; //根节点编号为0
for(int i=0;i<len;i++)
{
int id = s[i]-'a'; //第二种编码 0~25
if(!trie[root][id]) //如果之前没有从root到id的前缀
trie[root][id] = ++tot; //插入,tot即为第一种编号
sum[trie[root][id]]++; //前缀保存
root = trie[root][id]; //顺着字典树往下走
}
}
int find()
{
int len = strlen(s);
root = 0; //从根节点开始查找
for(int i=0;s[i];i++)
{
int x = s[i]-'a';
if(trie[root][x]==0) //以root为头节点的x的字母不存在
return 0;
root = trie[root][x]; //为查询下个字母做准备,往下走
}
//root经过循环后变成前缀最后一个字母所在位置
return sum[root]; //返回出现的次数
}
int main()
{
memset(sum,0,sizeof(sum));
while(gets(s) && s[0]!='\0')
{
insert();
}
while(gets(s) && s[0]!='\0')
{
printf("%d\n",find());
}
return 0;
}