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;
}