NYOJ 290 动物统计加强版(字典树姗姗来迟)

以前学数据结构的时候吧字典树忽视了,导致到现在才学到。
字典树是一种树形的数据结构,插入的复杂度为单词的平均长度。本题只需要写一个插入函数就可以了。
由于过几天就要省赛了,等到省赛后总结一下字典树。

//  trietree.cpp : 定义控制台应用程序的入口点。
//
#include<cstdio>
#include<iostream>
#include< string.h>

using  namespace std;
const  int num_chars = 26;             // 关键码最大位

int _max;
char ans[12];

class Trie
{
public:
    Trie();
    Trie(Trie& tr);
     virtual ~Trie();
     // int trie_search(const char* word, char*entry) const;
     bool insert( const  char* word);
protected:
     struct Trie_node    // 关键码类型
    {
         bool isfin;
         int cnt;                      // 关键码当前位数
        Trie_node* branch[num_chars];    // 关键码存放数组
        Trie_node();
    };
    Trie_node* root;
};

Trie::Trie_node::Trie_node()    // 结点定义
{
    isfin =  false;
    cnt = 0;
     for( int i = 0; i < num_chars;++i)
        branch[i] = NULL;
}

Trie::Trie():root(NULL)
{
}

Trie::~Trie()
{
}



bool Trie::insert( const  char*word)
{
     int result = 1,position = 0;
     if(root == NULL)
        root =  new Trie_node;
     char char_code;
    Trie_node *location = root;
     while(location != NULL && *word != 0)
    {
         if(*word >= 'a'&& *word <= 'z')
            char_code = *word - 'a';
         if(location->branch[char_code] == NULL)
            location->branch[char_code] =  new Trie_node;
        location = location->branch[char_code];
        position++;
        word++;
    }

    ++location->cnt;
     if(location->cnt>_max)
    {
        _max=location->cnt;
         return  true;
    }
     else
     return  false;
}


int main()
{
    Trie t;
     int n;
     while(scanf("%d",&n)!=EOF)
    {
        _max=0;
         char s[12];
         for( int i=0;i<n;++i)
        {
            scanf("%s",s);
             if(t.insert(s))
            {
                strcpy(ans,s);
            }

        }
        printf("%s %d\n",ans,_max);
    }


     return 0;
}

你可能感兴趣的:(NYOJ 290 动物统计加强版(字典树姗姗来迟))