字典树原理

字典树的操作:

class Trie
{
    public:
       int v;
       Trie *next[26];
       Trie()
       {
           v=0;
           memset(next,NULL,sizeof(next));
       }
};

Trie *root;

void Insert(char *S)
{
    int len=strlen(S);
    Trie *p=root;
    for(int i=0;i<len;i++)
    {
        int id=S[i]-'a';
        if(p->next[id]==NULL)
            p->next[id]=new Trie();
        p=p->next[id];
    }
    p->v++;
}

int Find(char *S)  //如果找到S串,返回它在字典树中出现次数,否则返回0
{
    Trie *p=root;
    int len=strlen(S);
    for(int i=0;i<len;i++)
    {
        int id=S[i]-'a';
        p=p->next[id];
        if(p==NULL) return 0;
    }
    return p->v;
}

int Delete(Trie *T)      //删除整棵字典树
{
    if(T==NULL) return 0;
    for(int i=0;i<26;i++)
        if(T->next[i]!=NULL)
            Delete(T->next[i]);
    delete T;
    return 0;
}

root=new Trie();  //main中的初始化


当然,删除一个单词我们只需要把它末尾的v值改为0即可。

 

 

典型题目:

HDU1004          http://acm.hdu.edu.cn/showproblem.php?pid=1004

HDU1251          http://acm.hdu.edu.cn/showproblem.php?pid=1251

HDU1671          http://acm.hdu.edu.cn/showproblem.php?pid=1671

Codeforces-12C   http://codeforces.com/contest/12/problem/C

HDU2072          http://acm.hdu.edu.cn/showproblem.php?pid=2072

 

下面重点说说HDU2072的字典树做法:

题意:给定一串单词,统计一共有多少个不同的单词。(注意输入时单词之间可以有任意多个空格)

 

分析:先把每一个单词插入字典树中,结尾就v++,最后再来遍历字典树,统计有多少个v不为0即可。

 

int Search(Trie *T)
{
    if(T==NULL) return 0;
    for(int i=0; i<26; i++)
        if(T->next[i]!=NULL)
            Search(T->next[i]);
    if(T->v!=0) cnt++;
    return 0;
}

 

你可能感兴趣的:(字典树原理)