字典树模板题,题目要求求给出的单词在词典中作为前缀的次数,那么其实就是遍历字典树找到输出cont,找不到输出0就搞定了~
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
struct trie //字典树节点结构体
{
int cont; //当前字母出现次数
trie *next[27]; //下一个节点的指针
trie() //节点初始化函数
{
cont=0;
memset(next,0,sizeof(next));
}
};
trie *root;
void init(char *v) //建树
{
int i;
trie *p=root;
for(i=0;v[i];i++)
{
int tep=v[i]-'a';
if(p->next[tep]==NULL) p->next[tep]=new trie(); //如果节点不存在则建立新节点
p=p->next[tep]; //移动到下一个节点
p->cont++; //计数加1
}
}
int finde(char *v) //查找
{
int i;
trie *p=root;
for(i=0;v[i];i++)
{
int tep=v[i]-'a';
p=p->next[tep];
if(p==NULL) return 0; //指针为空, 说明不在字典树内
}
return p->cont; //查完单词 当前节点次数。
}
void del(trie *p) //释放节点
{
for(int j=0;j<26;j++) if(p->next[j]!=NULL) del(p->next[j]);
free(p);
}
int main()
{
char v[12];
root=new trie(); //新建根
while(gets(v),strcmp(v,""))
{
init(v);
}
while(gets(v)!=NULL)
{
printf("%d\n",finde(v));
}
del(root);
}