题目http://acm.hdu.edu.cn/showproblem.php?pid=1251;
hash的一个变种,trie(字典树):
构造的树形如上图,不过有一点要记住,就是这道题中,,用next[id]这个指针来作为节点的地址。而通过next[id]->count来存放有这种前缀的单词的个数。。。
代码:
#include<iostream>
#include<cstring>
using namespace std;
typedef struct Trie
{
Trie* next[26];
int count;
}xixi;
xixi root;
void maketrie(char* str)//建立树形
{
xixi *p=&root,*q;
int len=strlen(str);
for(int i=0;i<len;i++)
{
int id=str[i]-'a';
if(p->next[id]==NULL)
{
q=(xixi*)malloc(sizeof(xixi));
for(int j=0;j<26;j++)
q->next[j]=NULL;
q->count=1;
p->next[id]=q;
p=p->next[id];
}
else
{
p->next[id]->count++;
p=p->next[id];
}
}
}
void findcount(char* str)//计算出现这种前缀的个数count
{
xixi *p=&root;
int len=strlen(str);
for(int i=0;i<len;i++)
{
int id=str[i]-'a';
if(p->next[id]==NULL)
{
cout<<'0'<<endl;
return ;
}
else
{
p=p->next[id];
}
}
cout<<p->count<<endl;
return ;
}
int main(void)
{
char str[20];
while(gets(str),str[0]!='/0')//这里要注意,不能用‘/n’作为结束,这样就错误了。(哎,还犯这种错误)
maketrie(str);
while(gets(str))
findcount(str);
return 0;
}