HDU -1251 统计难题 【字典树】 题解

我会带着你远行 2021-07-24 19:34 451阅读 0赞

目录

      • 1.题目
      • 2.代码

1.题目

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
2
3
1
0

2.代码

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. using namespace std;
  6. const int maxn = 26;
  7. struct Trie
  8. {
  9. Trie *Next[maxn]; //当前节点可以延伸出的边
  10. int flag;
  11. Trie() //函数,初始化以该信息为前缀的信息个数
  12. {
  13. flag = 1;
  14. memset(Next, NULL, sizeof(Next));
  15. }
  16. }*root; //根节点
  17. void insert(char *str)
  18. {
  19. int len = strlen(str);
  20. Trie *p = root, *q;
  21. for (int i = 0; i < len; i++)
  22. {
  23. int id = str[i] - 'a';
  24. if (p->Next[id] == NULL)如果该节点指向的下一个节点为空(没有一条边延伸出去)
  25. {
  26. q = new Trie(); //新建一个节点
  27. p->Next[id] = q; //存储节点
  28. p = p->Next[id]; ///指向该节点
  29. }
  30. else
  31. {
  32. p = p->Next[id];
  33. ++(p->flag); ///累加个数
  34. }
  35. }
  36. }
  37. int search(char *str)
  38. {
  39. int len = strlen(str);
  40. Trie *p = root;
  41. for (int i = 0; i < len; i++)
  42. {
  43. int id = str[i] - 'a';
  44. p = p->Next[id];
  45. if (p == NULL) return 0;
  46. }
  47. return p->flag;
  48. }
  49. ///释放
  50. void free(Trie *T)
  51. {
  52. if (T == NULL) return;
  53. for (int i = 0; i < maxn; i++)
  54. {
  55. if (T->Next[i])
  56. {
  57. free(T->Next[i]);
  58. }
  59. }
  60. delete(T);
  61. }
  62. int main()
  63. {
  64. char str[20];
  65. root = new Trie(); //建立根节点
  66. while (gets(str))
  67. {
  68. if (str[0] == '\0') break;
  69. insert(str);
  70. }
  71. while (scanf("%s", str) != EOF)
  72. {
  73. printf("%d\n", search(str));
  74. }
  75. free(root);
  76. return 0;
  77. }

发表评论

表情:
评论列表 (有 0 条评论,451人围观)

还没有评论,来说两句吧...

相关阅读

    相关 字典统计难题 hdu1251

    这一题本来打算存到一个字符串的数组里,到输入要查找的前缀后再去查找;结果去实现时发现如果要提前给的单词非常多的话每次查找都是比较慢的;交上去果断TLE.... 即使用了快排,