本题主要是求构造一棵Trie树,即词典树用于统计单词。

C#代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace TestOJ
  8. {
  9. public class AplusB
  10. {
  11. static void Main()
  12. {
  13. TestTrie1();
  14. }
  15. private static void TestTrie1()
  16. {
  17. int n = int.Parse(Console.ReadLine());
  18. Trie trie = new Trie();
  19. for (int i = ; i < n; i++)
  20. {
  21.  
  22. string line = Console.ReadLine();
  23. trie.Insert(line);
  24. }
  25. int m = int.Parse(Console.ReadLine());
  26. for (int i = ; i < m; i++)
  27. {
  28. string line = Console.ReadLine();
  29.  
  30. Console.WriteLine(trie.Serch(line));
  31.  
  32. }
  33. }
  34. class Trie
  35. {
  36. public Trie()
  37. {
  38. root = new TrieNode();
  39. }
  40. const int SIZE = ;
  41. TrieNode root;
  42. public void Insert(string str)
  43. {
  44. TrieNode node = root;
  45. for (int i = ; i < str.Length; i++)
  46. {
  47. var c = str[i];
  48. var idx = c - 'a';
  49. if (node.Nodes[idx] == null)
  50. {
  51. TrieNode temp = new TrieNode();
  52. temp.value = c;
  53. node.Nodes[idx] = temp;
  54. }
  55. else
  56. {
  57. node.Nodes[idx].num++;
  58. }
  59. node = node.Nodes[idx];
  60. }
  61. node.isEnd = true;
  62. }
  63. public int Serch(string str)
  64. {
  65. TrieNode node = root;
  66. for (int i = ; i < str.Length; i++)
  67. {
  68. var c = str[i];
  69. var idx = c - 'a';
  70. if (node.Nodes[idx] == null)
  71. return ;
  72. node = node.Nodes[idx];
  73. }
  74. return node.num;
  75. }
  76. class TrieNode
  77. {
  78. internal TrieNode[] Nodes;
  79. internal bool isEnd;
  80. internal char value;
  81. internal int num;
  82. public TrieNode()
  83. {
  84. Nodes = new TrieNode[SIZE];
  85. num = ;
  86. }
  87. }
  88. }
  89. }
  90. }

该代码耗时 3312ms,内存 107MB。

如果仅从实现统计功能需求来考虑的话,我的另一个方式是使用字典来进行统计。原理是对每一个单词进行从头到尾的拆分,每一次拆分的单词作为一个key,value则统计每一次获取到该key的次数。代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace TestOJ
  8. {
  9. public class AplusB
  10. {
  11. static void Main()
  12. {
  13. int n = int.Parse(Console.ReadLine());
  14. Dictionary<string, int> dict = new Dictionary<string, int>(n * );
  15. for (int i = ; i < n; i++)
  16. {
  17.  
  18. string line = Console.ReadLine();
  19. for (int j = ; j <= line.Length; j++)
  20. {
  21. string cut = line.Substring(, j);
  22. if (!dict.ContainsKey(cut))
  23. {
  24. dict.Add(cut, );
  25. }
  26. else
  27. {
  28. dict[cut]++;
  29. }
  30. }
  31. }
  32. int m = int.Parse(Console.ReadLine());
  33. for (int i = ; i < m; i++)
  34. {
  35. string line = Console.ReadLine();
  36. if (dict.ContainsKey(line))
  37. {
  38. Console.WriteLine(dict[line]);
  39. }
  40. else
  41. {
  42. Console.WriteLine();
  43. }
  44. }
  45. }
  46. }
  47. }

该代码耗时 3069ms,消耗内存 48MB。

可以看到耗费的时间和内存都有所减少,缺点是无法统计到匹配的是那些单词。

#1014 Trie树的更多相关文章

  1. hiho #1014 : Trie树

    #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助, ...

  2. hihoCoder 1014 Trie树 (Trie)

    #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho是一对好朋友.出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮 ...

  3. Hihocoder #1014 : Trie树 (字典数树统计前缀的出现次数 *【模板】 基于指针结构体实现 )

    #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助, ...

  4. hihoCoder #1014 : Trie树 [ Trie ]

    传送门 #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...

  5. codevs——4189 字典&&HihoCoder #1014 : Trie树

    题目描述 Description 最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000) 现在skyzhong需要在字典里查询以某一段字母开头的 ...

  6. 【Hihocoder】1014 : Trie树

    问题:http://hihocoder.com/problemset/problem/1014 给定一个字符串字典dict,输入字符串str, 要求从dict中找出所有以str为前缀的字符串个数. 构 ...

  7. 1014 : Trie树 hihocoder

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. ...

  8. #1014 : Trie树 HihoCoder(字典树)

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  9. hiho #1014 : Trie树(模板)

    Trie树 [题目链接]Trie树 &题意: 输入 输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英 ...

随机推荐

  1. Spring(二)__bean的装配

    Bean的装配: 在spring容器内拼凑bean叫做装配.装 配bean的时候,需要告诉容器哪些bean 以及容器如何使用依赖注入将它们配合在一起. 上下文定义文件的根元素是<beans> ...

  2. zookeeper集群

    0,Zookeeper基本原理 ZooKeeper集群由一组Server节点组成,这一组Server节点中存在一个角色为Leader的节点,其他节点都为Follower.当客户端Client连接到Zo ...

  3. Sass-也许你想和CSS玩耍起来(上篇)

    我们努力,我们坚持,共勉! 众所周知,css其实不是一门编程语言,熟悉的人都知道css全称Cascading Style Sheets(层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用) ...

  4. 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离

    /// <summary> /// 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离 /// </summary> /// <param name ...

  5. [DOM Event Learning] Section 3 jQuery事件处理基础 on(), off()和one()方法使用

    [DOM Event Learning] Section 3 jQuery事件处理基础 on(),off()和one()方法使用   jQuery提供了简单的方法来向选择器(对应页面上的元素)绑定事件 ...

  6. Android UI ListView的使用

    一.ListView的理解  1.什么ListView?   一种用来显示多个可滑动项(Item)列表的的ViewGroup 需要使用Adapter将集合数据和每一个Item所对应的布局动态适配到Li ...

  7. iOS之weak和strong、懒加载及循环引用

    一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...

  8. ios webview自适应实际内容高度4种方法

    有的时候会碰见类似的苦逼需求, webview自适应实际内容高度 下面有四种方法供使用 方法1:获取webview中scrovllview的contentsize进行设置   1 2 3 4 5 6 ...

  9. IOS RunLoop浅析 三

    经过两篇的介绍我想对RunLoop应该有了简单的了解,至少不至于一无所知. 在这篇我想对“CFRunLoopObserverRef”做一下简单的补充. 在补充之前先说一下. 在现在的开发中已经很少见到 ...

  10. JVM之Parallel Scavenge收集器

    新生代收集器,复制算法,并行收集,面向吞吐量要求(吞吐量优先收集器). 吞吐量=用户代码运行时间/(用户代码运行时间+垃圾回收时间) -XX:MaxGCPauseMillis:控制最大垃圾收集停顿时间 ...