1.核心代码
void createTrie(char *str) //生成字典树
{
int len = strlen(str);
Trie *p = root, *q;
for(int i=0; i<len; ++i)
{
int id = str[i]-'0';
if(p->next[id] == NULL)
{
q = (Trie *)malloc(sizeof(Trie));
q->v = 1; //初始v==1
for(int j=0; j<MAX; ++j)
q->next[j] = NULL;
p->next[id] = q;
p = p->next[id];
}
else
{
p->next[id]->v++;
p = p->next[id];
}
}
p->v = -1; //若为结尾,则将v改成-1表示
}
int findTrie(char *str) //查找
{
int len = strlen(str);
Trie *p = root;
for(int i=0; i<len; ++i)
{
int id = str[i]-'0';
p = p->next[id];
if(p == NULL) //若为空集,表示不存以此为前缀的串
return 0;
if(p->v == -1) //字符集中已有串是此串的前缀
return -1;
}
return -1; //此串是字符集中某串的前缀
}
2.Hdu--1056 统计难题
题目大意:统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
#include <iostream>
#include <cstdio>
#include <string.h>
#include <malloc.h>
using namespace std;
struct Tire
{
int count;
struct Tire *tire[26];
}*a;
void init(){
a=(Tire*)malloc(sizeof(Tire));
for(int i=0;i<26;++i)
a->tire[i]=NULL;
}
void insert(char ch[])
{
int length=strlen(ch);
Tire *head=a;
int i,j,k;
for(i=0;i<length;++i)
{
k=(int)(ch[i]-97);
if(head->tire[k]!=NULL)
{
head=head->tire[k];
head->count++;
}
else{
head->tire[k]=new Tire;
head=head->tire[k];
head->count=1;
for(j=0;j<26;++j)
head->tire[j]=NULL;
}
}
}
int find(char chh[]){
int llen=strlen(chh);
Tire *newhead=a;
int i,j,k;
for(i=0;i<llen;++i){
k=(int)(chh[i]-97);
if(newhead->tire[k]!=NULL)
newhead=newhead->tire[k];
else
{return 0;}
}
return newhead->count;
}
int main()
{
char s[10],ss[10];
init();
int len,num=0;
while(gets(s))
{
len=strlen(s);
if(len==0) break;
insert(s);
}
while(gets(ss))
{
num=0;
num=find(ss);
printf("%d\n",num);
}
}