#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;
}