字典树示意图:
它有3个基本性质:
根节点不包含字符,除根节点外每一个节点都只包含一个字符。 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点包含的字符都不相同。
AC代码。
#include <iostream>
using namespace std;
#define MAX 26
struct TrieNode{
int nCount;
TrieNode* next[MAX];
};
/*创建新节点*/
TrieNode* CreateTrieNode(){
int i;
TrieNode *p=new TrieNode();
p->nCount=1;
for (i=0;i<MAX;i++)
p->next[i]=NULL;
return p;
}
/*插入新的串*/
void InsertTrie(TrieNode* pRoot,char *s){
int i,k;
TrieNode *p;
if (!pRoot)
pRoot=CreateTrieNode();
p=pRoot;
i=0;
while(s[i]){
k=s[i]-'a';
i++;
if (p->next[k])
p->next[k]->nCount++;
else p->next[k]=CreateTrieNode();
p=p->next[k];
}
}
/*查找串*/
int SearchTrie(TrieNode* pRoot,char *s){
TrieNode *p;
int i,k;
p=pRoot;
if (!p)
return 0;
i=0;
while (s[i]){
k=s[i]-'a';
i++;
if (p->next[k]==NULL)
return 0;
p=p->next[k];
}
return p->nCount;
}
int main(){
char s[11];
TrieNode *pRoot=CreateTrieNode();
gets(s);
while (s[0]!=0){
InsertTrie(pRoot,s);
gets(s);
}
while (cin>>s){
cout<<SearchTrie(pRoot,s)<<endl;
}
return 0;
}