#1014 Trie树
本题主要是求构造一棵Trie树,即词典树用于统计单词。
C#代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace TestOJ
- {
- public class AplusB
- {
- static void Main()
- {
- TestTrie1();
- }
- private static void TestTrie1()
- {
- int n = int.Parse(Console.ReadLine());
- Trie trie = new Trie();
- for (int i = ; i < n; i++)
- {
- string line = Console.ReadLine();
- trie.Insert(line);
- }
- int m = int.Parse(Console.ReadLine());
- for (int i = ; i < m; i++)
- {
- string line = Console.ReadLine();
- Console.WriteLine(trie.Serch(line));
- }
- }
- class Trie
- {
- public Trie()
- {
- root = new TrieNode();
- }
- const int SIZE = ;
- TrieNode root;
- public void Insert(string str)
- {
- TrieNode node = root;
- for (int i = ; i < str.Length; i++)
- {
- var c = str[i];
- var idx = c - 'a';
- if (node.Nodes[idx] == null)
- {
- TrieNode temp = new TrieNode();
- temp.value = c;
- node.Nodes[idx] = temp;
- }
- else
- {
- node.Nodes[idx].num++;
- }
- node = node.Nodes[idx];
- }
- node.isEnd = true;
- }
- public int Serch(string str)
- {
- TrieNode node = root;
- for (int i = ; i < str.Length; i++)
- {
- var c = str[i];
- var idx = c - 'a';
- if (node.Nodes[idx] == null)
- return ;
- node = node.Nodes[idx];
- }
- return node.num;
- }
- class TrieNode
- {
- internal TrieNode[] Nodes;
- internal bool isEnd;
- internal char value;
- internal int num;
- public TrieNode()
- {
- Nodes = new TrieNode[SIZE];
- num = ;
- }
- }
- }
- }
- }
该代码耗时 3312ms,内存 107MB。
如果仅从实现统计功能需求来考虑的话,我的另一个方式是使用字典来进行统计。原理是对每一个单词进行从头到尾的拆分,每一次拆分的单词作为一个key,value则统计每一次获取到该key的次数。代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace TestOJ
- {
- public class AplusB
- {
- static void Main()
- {
- int n = int.Parse(Console.ReadLine());
- Dictionary<string, int> dict = new Dictionary<string, int>(n * );
- for (int i = ; i < n; i++)
- {
- string line = Console.ReadLine();
- for (int j = ; j <= line.Length; j++)
- {
- string cut = line.Substring(, j);
- if (!dict.ContainsKey(cut))
- {
- dict.Add(cut, );
- }
- else
- {
- dict[cut]++;
- }
- }
- }
- int m = int.Parse(Console.ReadLine());
- for (int i = ; i < m; i++)
- {
- string line = Console.ReadLine();
- if (dict.ContainsKey(line))
- {
- Console.WriteLine(dict[line]);
- }
- else
- {
- Console.WriteLine();
- }
- }
- }
- }
- }
该代码耗时 3069ms,消耗内存 48MB。
可以看到耗费的时间和内存都有所减少,缺点是无法统计到匹配的是那些单词。
#1014 Trie树的更多相关文章
- hiho #1014 : Trie树
#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助, ...
- hihoCoder 1014 Trie树 (Trie)
#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho是一对好朋友.出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮 ...
- Hihocoder #1014 : Trie树 (字典数树统计前缀的出现次数 *【模板】 基于指针结构体实现 )
#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助, ...
- hihoCoder #1014 : Trie树 [ Trie ]
传送门 #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...
- codevs——4189 字典&&HihoCoder #1014 : Trie树
题目描述 Description 最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000) 现在skyzhong需要在字典里查询以某一段字母开头的 ...
- 【Hihocoder】1014 : Trie树
问题:http://hihocoder.com/problemset/problem/1014 给定一个字符串字典dict,输入字符串str, 要求从dict中找出所有以str为前缀的字符串个数. 构 ...
- 1014 : Trie树 hihocoder
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. ...
- #1014 : Trie树 HihoCoder(字典树)
描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...
- hiho #1014 : Trie树(模板)
Trie树 [题目链接]Trie树 &题意: 输入 输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英 ...
随机推荐
- Spring(二)__bean的装配
Bean的装配: 在spring容器内拼凑bean叫做装配.装 配bean的时候,需要告诉容器哪些bean 以及容器如何使用依赖注入将它们配合在一起. 上下文定义文件的根元素是<beans> ...
- zookeeper集群
0,Zookeeper基本原理 ZooKeeper集群由一组Server节点组成,这一组Server节点中存在一个角色为Leader的节点,其他节点都为Follower.当客户端Client连接到Zo ...
- Sass-也许你想和CSS玩耍起来(上篇)
我们努力,我们坚持,共勉! 众所周知,css其实不是一门编程语言,熟悉的人都知道css全称Cascading Style Sheets(层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用) ...
- 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离
/// <summary> /// 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离 /// </summary> /// <param name ...
- [DOM Event Learning] Section 3 jQuery事件处理基础 on(), off()和one()方法使用
[DOM Event Learning] Section 3 jQuery事件处理基础 on(),off()和one()方法使用 jQuery提供了简单的方法来向选择器(对应页面上的元素)绑定事件 ...
- Android UI ListView的使用
一.ListView的理解 1.什么ListView? 一种用来显示多个可滑动项(Item)列表的的ViewGroup 需要使用Adapter将集合数据和每一个Item所对应的布局动态适配到Li ...
- iOS之weak和strong、懒加载及循环引用
一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...
- ios webview自适应实际内容高度4种方法
有的时候会碰见类似的苦逼需求, webview自适应实际内容高度 下面有四种方法供使用 方法1:获取webview中scrovllview的contentsize进行设置 1 2 3 4 5 6 ...
- IOS RunLoop浅析 三
经过两篇的介绍我想对RunLoop应该有了简单的了解,至少不至于一无所知. 在这篇我想对“CFRunLoopObserverRef”做一下简单的补充. 在补充之前先说一下. 在现在的开发中已经很少见到 ...
- JVM之Parallel Scavenge收集器
新生代收集器,复制算法,并行收集,面向吞吐量要求(吞吐量优先收集器). 吞吐量=用户代码运行时间/(用户代码运行时间+垃圾回收时间) -XX:MaxGCPauseMillis:控制最大垃圾收集停顿时间 ...