• 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后留下的换行符'
    '
            getchar();
            for(int i = 0; i < n; i++)
            {
                getline(cin,dic);
                pre_num.CreateTrieTree(dic);
            }
    
            int m;
            cin >> m;
            //getchar吸收上边cin后留下的换行符'
    '
            //不然后边的getline会把遗留的'
    '作为输入读入
            getchar();
            string cmp;
            for(int j = 0;j < m; j++)
            {
                getline(cin,cmp);
                int ret = pre_num.CalcPrefixNum(cmp);
                cout<< ret <<endl;
    
            }
        }
    
        return 0;
    }
    
    
  • 相关阅读:
    [Clr via C#读书笔记]Cp4类型基础
    [Clr via C#读书笔记]Cp3共享程序集和强命名程
    [Clr via C#读书笔记]Cp2生成打包部署和管理应用程序和类型
    [Clr via C#读书笔记]Cp1CLR执行模型
    试用Markdown来写东西
    字符编码的总结
    常去的网站
    Click Once使用总结
    【LevelDB源码阅读】Slice
    【程序员面试金典】面试题 01.05. 一次编辑
  • 原文地址:https://www.cnblogs.com/lanqiu5ge/p/9472229.html
Copyright © 2020-2023  润新知