题意:

一串数字,给出出现频率最高的那个单词。

思路:

字典树:首先是建树,其实最麻烦的是概率处理部分,因为题目给定的单词都是按照字典有序排列的,所以可以对于概率进行一遍预处理,然后建树的时候就可以直接更新判断了。

题目同 POJ 1451 http://poj.org/problem?id=1451

#include <iostream>
#include <vector>
using namespace std;struct node {bool isword;int prob, index;int child[10];node(bool _isword, int _prob, int _index) :   isword(_isword), prob(_prob), index(_index){ memset(child, 0, sizeof(child)); }
};vector<node> trie;int tab[256];
char dict[1010][102];
int prob[1010][102];void Insert(const char* word, int i, int index, int rt)
{if (word[i] == '\0'){trie[rt].isword = true;return ;}int m = tab[word[i]];if (trie[rt].child[m]){if (trie[trie[rt].child[m]].prob < prob[index][i]){trie[trie[rt].child[m]].prob = prob[index][i];trie[trie[rt].child[m]].index = index;}else if (trie[trie[rt].child[m]].prob == prob[index][i]){if (strncmp(dict[index], dict[trie[trie[rt].child[m]].index], i + 1) < 0)trie[trie[rt].child[m]].index = index;}Insert(word, i + 1, index, trie[rt].child[m]);}else{trie.push_back(node(false, 0, 0));trie[rt].child[m] = trie.size() - 1;trie[trie[rt].child[m]].index = index;trie[trie[rt].child[m]].prob = prob[index][i];Insert(word, i + 1, index, trie[rt].child[m]);}
}int Query(const char* word, int rt)
{if (*word == '\0')return trie[rt].index;int m = *word - '0';if (!trie[rt].child[m])return -1;elsereturn Query(word + 1, trie[rt].child[m]);
}void Init()
{tab['a'] = tab['b'] = tab['c'] = 2;tab['d'] = tab['e'] = tab['f'] = 3;tab['g'] = tab['h'] = tab['i'] = 4;tab['j'] = tab['k'] = tab['l'] = 5;tab['m'] = tab['n'] = tab['o'] = 6;tab['p'] = tab['q'] = tab['r'] = tab['s'] = 7;tab['t'] = tab['u'] = tab['v'] = 8;tab['w'] = tab['x'] = tab['y'] = tab['z'] = 9;
}int main()
{int cases;Init();scanf("%d", &cases);for (int c = 1; c <= cases; ++c){int n, p;scanf("%d", &n);printf("Scenario #%d:\n", c);trie.clear();trie.push_back(node(false, 0, 0));memset(prob, 0, sizeof(prob));for (int i = 1; i <= n; ++i){scanf("%s %d", dict[i], &p);int len = strlen(dict[i-1]);for (int j = 0; dict[i][j] != '\0'; ++j){prob[i][j] = p;if (j < len && !strncmp(dict[i], dict[i-1], j + 1))prob[i][j] += prob[i-1][j];}Insert(dict[i], 0, i, 0);}char word[110], is[110], os[110];scanf("%d", &n);while (n--){scanf("%s", is);for (int i = 0; is[i] != '1'; ++i){word[i] = is[i];word[i+1] = '\0';int id = Query(word, 0);if (id != -1){int j = 0;for (j = 0; j <= i; ++j)os[j] = dict[id][j];os[j] = '\0';printf("%s\n", os);}else printf("MANUALLY\n");}printf("\n");}printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/kedebug/archive/2013/01/24/2875545.html

HDOJ 1298 T9(trie树简单应用)相关推荐

  1. HDU1251 统计难题 trie树 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 找前缀数量 裸模板 1 #include<cstdio> 2 #include< ...

  2. 双数组trie树的基本构造及简单优化

    一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...

  3. 基于Trie 树实现简单的中文分词

    中文分词简介 中文分词是中文自然语言处理的基础,中文分词的正确率如何直接影响后续的词性标注(也有些词性标注算法不需要事先分词,但标注效果往往比先分词后标注差),实体识别.句法分析.语义分析.常用的分词 ...

  4. POJ3630——简单Trie树

    这个题的意思是说,给出一些字符串,判断是否有字符串是另一个字符串的前缀,当然可以用排序水过,不过这个题拿来练习一下Trie树不错. 这个题在poj的discuss上好多人说必须要静态建树,估计都是用了 ...

  5. 【trie树】HDU1247Hat’s Words

    Hat's Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...

  6. 算法 | 动画+解析,轻松理解「Trie树」

    Trie这个名字取自"retrieval",检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 ...

  7. 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树......

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 上篇文章我们主要介绍了线性数据结构,本篇233酱带大家看看 无所不 ...

  8. BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...

  9. 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机

    目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...

最新文章

  1. cacti忘记密码怎么办
  2. 【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 )
  3. 织梦后台上传文章的php文件是那个,如何在织梦文章中上传视频及调用视频
  4. Python实现不规则txt文本数据读取并转换为csv文本
  5. aop执行跳过某个方法_简谈前端开发中的AOP(一) -- 前端AOP的实现思路
  6. 小辣椒p60手机怎么样_奇葩对决!3600元的格力手机与3599元的小辣椒V19,谁更强?...
  7. 抖音去水印解析网址入口_抖音去水印 视频去水印 小工具
  8. 了解常见的网络架构图
  9. php中mysqli用法举例
  10. 已编辑好的mysql_安装好的mysql改变数据库文件位置
  11. 于掌控板实现简单的抢答器系统
  12. idea 点击右侧栏找不到git或者svngit的基本使用
  13. 2016/4/22 图形用户界面
  14. kb4023057安装失败_微软重发KB4023057补丁致部分用户更新失败
  15. Nebula Graph介绍和SpringBoot环境连接和查询
  16. 携程——聪明的猴子 (容斥定理)
  17. 记一次Rider手写UnityShader_非图解基本的光照模型,包含ViewDir_NdotL高光和漫反射等等计算
  18. shell基础正则表达式
  19. java极光推送实例
  20. 【】每日360题,2019.11.07日14点财会类考试习题答案

热门文章

  1. 干货|如何在无回显时渗透
  2. 阿里云服务器的安装以及使用
  3. 分区格式化并给用户设定配额
  4. python学习笔记(四)字典(dict)
  5. 双塔模型在Airbnb搜索排名中的应用
  6. 聊聊JVM(八)说说GC标记阶段的一些事
  7. Elasticsearch技术解析与实战(三)文档的聚合
  8. Linux下安装scikit-learn
  9. katalon中REST URL占位参数动态化
  10. Python函数式编程中map()、reduce()和filter()函数的用法