#include <iostream>
#include <string.h>
using namespace std;
#define points 26
struct node;
typedef struct node *NumTree;
struct node
{
int count;
NumTree N[points];
};
NumTree init(NumTree T)
{
T=new struct node;
int i;
for(i=0;i<points;i++)
{
T->N[i]=NULL;
}
return T;
}
void Insert(NumTree T,char str[])
{
NumTree UseNow,s;
UseNow=T;
int i,len;
len=strlen(str);
int id;
for(i=0;i<len;i++)
{
id=str[i]-'a';
if(UseNow->N[id]==NULL)
{
s=new struct node;
s->count=1;
int j;
for(j=0;j<points;j++)
s->N[j]=NULL;
UseNow->N[id]=s;
UseNow=UseNow->N[id];
}
else
{
UseNow->N[id]->count++;
UseNow=UseNow->N[id];
}
}
}
int find(NumTree T,char str[])
{
int i,id;
NumTree P;
P=T;
int len=strlen(str);
for(i=0;i<len;i++)
{
id=str[i]-'a';
if(P->N[id]==NULL)
return 0;
else
P=P->N[id];
}
return P->count;
}
void FreeTree(NumTree T)
{
int i;
for(i=0;i<points;i++)
{
if(T->N[i]!=NULL)
{
FreeTree(T->N[i]);
free(T->N[i]);
}
else
return;
}
free(T);
}
int main()
{
NumTree T=NULL;
T=init(T);
char str[100];
while(gets(str) && str[0]!='\0')
Insert(T,str);
while(gets(str) && str[0]!='\0')
{
int sum=0;
sum=find(T,str);
cout<<sum<<endl;
}
FreeTree(T);
return 0;
}
FreeTree例程是我自己写的,没有办法检验,但我觉得根据递归应该把所有树都Free掉了,实际运行并没有出现问题,如果要使用本例程的人建议先检查一下哈!
如果有缺陷请留言指出!感激不尽!
以下是数组实现,思路没有改变,但是省略了Malloc的时间,直接从连续数组单元里提取ROOM。需要注意的是这种情况下Memory数组需要开的很大,不然会WA。
另外数组形式的Free例程有点不对劲···不知道为什么运行不了╮(╯▽╰)╭希望有大神指正!
当字典树超时的时候,用Memory形式存取,会减少一定时间,如果是MLE,那么可以在每一次处理完毕后Free一次字典树(不free的话,经过多次建立,会有一个以26为指数级增长的完全树,好可怕=。=)
#include <iostream>
#include <string.h>
using namespace std;
#define points 26
struct node;
typedef struct node *NumTree;
struct node
{
int count;
NumTree N[points];
};
struct node Memory[100000];
int ans=0;
NumTree init(NumTree T)
{
T=&Memory[ans++];
int i;
for(i=0;i<points;i++)
{
T->N[i]=NULL;
}
return T;
}
void Insert(NumTree T,char str[])
{
NumTree UseNow,s;
UseNow=T;
int i,len;
len=strlen(str);
int id;
for(i=0;i<len;i++)
{
id=str[i]-'a';
if(UseNow->N[id]==NULL)
{
s=&Memory[ans++];
s->count=1;
int j;
for(j=0;j<points;j++)
s->N[j]=NULL;
UseNow->N[id]=s;
UseNow=UseNow->N[id];
}
else
{
UseNow->N[id]->count++;
UseNow=UseNow->N[id];
}
}
}
int find(NumTree T,char str[])
{
int i,id;
NumTree P;
P=T;
int len=strlen(str);
for(i=0;i<len;i++)
{
id=str[i]-'a';
if(P->N[id]==NULL)
return 0;
else
P=P->N[id];
}
return P->count;
}
void FreeTree()
{
int i;
for(i=0;i<ans;i++)
{
free(&Memory[i].N);
free(&Memory[i]);
}
}
int main()
{
NumTree T=NULL;
T=init(T);
char str[100];
while(gets(str) && str[0]!='\0')
Insert(T,str);
while(gets(str) && str[0]!='\0')
{
int sum=0;
sum=find(T,str);
cout<<sum<<endl;
}
FreeTree();
return 0;
}