/*
字典树
操作:
1.插入
3.查找
*/
#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
const int MAXN=10010;//单词的个数
const int ALPH=26;//字母表个数
typedef struct TireNode{
TireNode* next[ALPH];
int count;//表示该节点对应单词的个数
TireNode()
{
count=0;
for(int i=0;i<ALPH;++i)
next[i]=NULL;
};
} Node;
Node node[MAXN];
int top=0;
Node* root;
Node* CreatNode()
{
Node* np=&node[top++];
return np;
}
void InsertNode(Node* root,char *s)//字符串的根 字符串
{
int len=strlen(s);
Node *newp;
newp=root;
for(int i=0;i<len;++i)
{
if(newp->next[s[i]-'a']==NULL)
{
newp->next[s[i]-'a']=CreatNode();
}
newp=newp->next[s[i]-'a'];
}
newp->count+=1;
}
Node* searchNode(Node* root,char* s)//返回节点对应的地址
{
int len=strlen(s);
Node* newp;
newp=root;
for(int i=0;i<len;++i)
{
newp=newp->next[s[i]-'a'];
if(!newp)
return NULL;
}
return newp;
}
int main()
{
top=0;
root=&node[top++];
int m;
char s[30];
scanf("%d",&m);
while(m--)
{
scanf("%s",s);
InsertNode(root,s);
}
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
Node* midp;
midp=searchNode(root,s);
if(midp==NULL)
cout<<0<<endl;
else
cout<<midp->count<<endl;
}
}
每个节点有有一个指针数组,指向字母对应的下一个节点。若对应节点不存在,则p=null。