hihoCoder #1014 Trie树

这是第一次在hihoCoder上刷题,对hihoCoder知道的也不是很多,只知道2015微软实习生在线笔试和网易游戏在线笔试都通过这个平台组织的。
下面简单说一下对hihoCoder的印象(只是个人直观的感觉,不论对错):
1、题目组织;
hihoCoder题库的题全是课堂的形式组织出题,(好像)每周有一道,用户可以像参加随堂考试一样让你找回年轻时的感觉。
2、题目描述;
我感觉最好也是最有意思的就是题目的描述了。全部采用小hi和小ho两人间的对话来表达题意;而且力求把所有情况描述清楚。
穿插在两人对话之间,会有提示,这里的提示更像课堂知识讲解,把你不了解的概念和比较高效的idea都呈现给你,通俗易懂,可以达到快速充电、随学随用的效果。
3、编辑器;
编译器就不说了,还是大多数OJ都支持的GCC、G++C#、java。
说说编辑器:
在这里提供三种编辑器,非常方便;包括Emacs、vim、Normal三种形式,可以满足绝大部分人的编码需要。使用这三种编辑器编写代码我个人感觉是对习惯IDE编程的Coder的最好的帮手去克服对IDE的自动代码补全和拼写错误检查和语法错误检查的依赖,使Coder更加了解自己写的代码,更容易注意到惯犯的错误。
所以强烈推荐使用以上风格的编辑器进行Coding。


下面来说一下Trie树这道题:
hihoCoder Trie树
下面是Trie树这道题我自己的一个答案:正确AC,但的确有待改进和完善的地方。

#include<iostream>
#include<string>
using namespace std;

const int width = 27;
typedef struct TreeNode
{
    char val;
    int pathed_num;
    TreeNode *next[width];
    TreeNode(char x)
    {
        val = x;
        pathed_num = 0;
        for(int i=0; i<width; i++)
            next[i] = NULL;
    }
}*treeNode;

class FindPrefixNum
{
public:
    FindPrefixNum()
    {
        Node = new TreeNode(0);
        root = Node;
    }

    ~FindPrefixNum()
    {
        delete Node;
    }

    int CalcPrefixNum(string &str)
    {
        Node = root;
        size_t i = 0;
        for(; i < str.size(); i++)
        {
            if (Node->next[str[i]-'a'] != NULL && Node->next[str[i]-'a']->val == str[i])
                Node = Node->next[str[i]-'a'];
            else
                break;    
        }

        if(i != str.size())
            return 0;
        else
            return Node->pathed_num;
    }

    TreeNode* CreateTrieTree(string &str)
    {
        Node = root;
        if(str[0] < 'a' || str[0] > 'z' )
            return NULL;
        for(size_t i = 0; i < str.size(); i++)
        {
            TreeNode *node = new TreeNode(str[i]);
            if (Node->next[str[i]-'a'] != NULL)
            {
                Node = Node->next[str[i]-'a'];
                Node->pathed_num ++;
            }else
            {
                Node->next[str[i]-'a'] = node;
                Node = node;
                Node->pathed_num++;
            }
            //cout<<Node->val<<":"<<Node->pathed_num<<endl;
        }

        return root;
    }

private:
    TreeNode *Node;
    TreeNode *root;
};

int main()
{
    string dic;
    int n;
    while(cin >> n)
    {
        FindPrefixNum pre_num;
        //getchar吸收上边cin后留下的换行符'\n'
        getchar();
        for(int i = 0; i < n; i++)
        {
            getline(cin,dic);
            pre_num.CreateTrieTree(dic);
        }

        int m;
        cin >> m;
        //getchar吸收上边cin后留下的换行符'\n'
        //不然后边的getline会把遗留的'\n'作为输入读入
        getchar();
        string cmp;
        for(int j = 0;j < m; j++)
        {
            getline(cin,cmp);
            int ret = pre_num.CalcPrefixNum(cmp);
            cout<< ret <<endl;

        }
    }

    return 0;
}

posted @ 2015-04-05 22:34  lanqiu5ge  阅读(130)  评论(0编辑  收藏  举报