题目连接:hihoCoder1014
分析:建立一颗词典树,对于每一次询问,输出以该询问对应字符串的num值即可。
实现代码如下:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
#define son_num 30 //字符串中包含的字符个数
#define maxn 10 //单词的最大长度
struct tire
{
int num; //纪录到达该节点的字符串的个数,即相同前缀数
bool terminal; //如果terminal=true,表示当前点为该字符串最后一个字符
struct tire *next[son_num]; //纪录下一个节点
};
tire *root;
tire *init() //创建新节点
{
tire *p=(tire *)malloc(sizeof(tire));
for(int i=0;i<son_num;i++)
p->next[i]=NULL;
p->terminal=false;
p->num=0;
return p;
}
void insert(tire *root,char str[]) //插入操作
{
int i=0;
tire *p=root;
while(str[i]!='\0')
{
if(!p->next[ str[i]-'a' ]) //如果不存在,建立新节点
p->next[ str[i]-'a' ]=init();
p=p->next[ str[i]-'a' ];
p->num++;
i++;
}
p->terminal=true;
}
bool find(tire *p,char str[]) //查找操作
{
int i=0;
while(str[i]!='\0'&&p->next[ str[i]-'a' ])
{
p=p->next[ str[i]-'a' ];
i++;
}
if(str[i]=='\0') printf("%d\n",p->num);
else puts("0");
}
void del(tire *root) //清空操作
{
for(int i=0;i<son_num;i++)
if(root->next[i]!=NULL)
del(root->next[i]);
free(root);
}
int main()
{
root=init(); //创建根结点
char str[maxn];
int n,m; //n为建立字典树的单词数,m为要查找的单词数
cin>>n;
for(int i=0;i<n;i++) //建立字典树
{
scanf("%s",str);
insert(root,str);
}
cin>>m;
for(int i=0;i<m;i++) //查找操作
{
scanf("%s",str);
find(root,str);
}
del(root); //释放字典树占用的空间
return 0;
}