【字典树】统计难题

描述

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现,现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀)。

输入

输入数据的第一部分是一张单词表(不超过15000个),每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词(不超过25000个),一个空行代表单词表的结束。第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串。

注意:本题只有一组测试数据,处理到文件结束。

输出

对于每个提问,给出以该字符串为前缀的单词的数量。

样例输入

banana
band
bee
absolute
acm

ba
b
band
abc

样例输出

2
3
1
0

分析:
基础字典树问题,想象其结构并将其实现。(Trie树)
’代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int num;
node *next[26];
};
node root;
void Create(string s)//建立字典树
{
int l=s.length();
node *p=&root,q;
for (int i=0;i<l;i++)
{
int mem=s[i]-‘a’;
if (p->next[mem]==NULL)
{
q=(node
)malloc(sizeof(root));
q->num=1;
for (int j=0;j<26;j++)
q->next[j]=NULL;
p->next[mem]=q;
p=p->next[mem];
}
else
{
p->next[mem]->num++;
p=p->next[mem];
}
}
}
int Find(string s)
{
int l=s.length();
node *p=&root;
for (int i=0;i<l;i++)
{
int mem=s[i]-‘a’;
p=p->next[mem];
if (p==NULL) return 0;
}
return p->num;
}
void init()
{
string s;
for (int i=0;i<26;i++)
root.next[i]=NULL;
while(getline(cin,s)&&s[0]!=’\0’)
{
Create(s);
}
while(cin>>s)
{
int ans=Find(s);
cout<<ans<<endl;
}
}
int main()
{
init();
return 0;
}

发布了69 篇原创文章 · 获赞 0 · 访问量 1873

猜你喜欢

转载自blog.csdn.net/Skynamer/article/details/104077206
今日推荐