Trie树的题目还有 HDU 1800 Flying to the Mars
http://acm.hdu.edu.cn/showproblem.php?pid=1251
字典树(Trie)是一种用于快速字符串检索的多叉树结构。其原理是利用字符串的公共前缀来降低时空开销,从而达到提高程序效率的目的。
它有如下简单的性质:
(1) 根节点不包含字符信息;
(3) 一棵m度的Trie或者为空,或者由m棵m度的Trie组成。
搜索字典项目的方法为:
(1) 从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树 并转到该子树继续进行检索;
(3) 在相应的子树上,取得要查找关键词的第二个字母,
并进一步选择对应的子树进行检索。
(4) 迭代过程……
(5) 在某个结点处,关键词的所有字母已被取出,则读取
附在该结点上的信息,即完成查找。
以下为HDU1251的代码
#include<iostream>
#include<string>
using namespace std;
const int N=26;
struct TNode
{
string meaning;
int branch;
bool isWord;//用于判断是否为最后一个字母,之前的是否为一个单词
TNode *next[N];//分别指向拓展的分支
TNode()
{
meaning="";
branch=0;
isWord=false;
for(int i=0; i
//cout<<"Node create"<<endl;
}
};
struct Trie
{
TNode* root;
// 构造函数
Trie()
{
root=new TNode();
//cout<<" i am constructing..."<<endl;
}
bool Insert(string word)
{
TNode *p=root;
if(p==NULL) p=new TNode();
for(int i=0; i
{
int ccode=word[i]-'a';
if(p->next[ccode]==NULL)//每一层上和我一样的节点有过否,没有我就要重新new出一个节点
{
p->next[ccode]=new TNode();
}
p=p->next[ccode];
p->branch++;
}
p->isWord=true;
return true;
}
int Find(string word)
{
TNode *p=root;
if(p==NULL) return 0;
for(int i=0; i
{
int ccode=word[i]-'a';
if(p->next[ccode]==NULL) return 0;
p=p->next[ccode];
}
return p->branch;
}
};
Trie *Root;
void createDict()
{
Root=new Trie();
while(true)
{
string s;
getline(cin,s);
if(s.size()==0)break;
Root->Insert(s);
}
}
bool run()
{
string s;
if(!(cin>>s)) return false;
cout<<Root->Find(s)<<endl;
return true;
}
int main()
{
createDict();
while(run());
return 0;
}