Trie 树(字典树)HDU 1251

来源:互联网 发布:职工信息管理系统c语言 编辑:程序博客网 时间:2024/05/29 07:05

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) 在某个结点处,关键词的所有字母已被取出,则读取
      附在该结点上的信息,即完成查找。

 

 

Trie <wbr>树(字典树)HDU <wbr>1251

Trie <wbr>树(字典树)HDU <wbr>1251

Trie <wbr>树(字典树)HDU <wbr>1251

Trie <wbr>树(字典树)HDU <wbr>1251

以下为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;
}

 

 

0 0
原创粉丝点击