hdu 1298 字典树 + DFS (模拟T9文本输入)
题意:
给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方
法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么
ab 的概率就是2 ,而不是4,一开始我误认为是所有单词累加后再把每个单词的每个字母累加作为当前单词的概率的,结果各种wa。
思路:
先建一颗字典树,为了是节省内存,方便更新,和快速查询,其实hash也可以
,不过我自己一般都是用map去hasn,目测这个题目map去hash会TLE,因为要设计到拆串和各种mark,map是排序的,说远了,建树的时候记得更新概率值,然后就是暴力深搜,把每一个长度的都找出来,然后开个数组更新当前的最有和记录答案串,深搜的时候a,b,c...这样自然就是字典序.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Tree
{
Tree *next[26];
int v;
}Tree; Tree root;
char now[111] ,ans_str[222][111];
int max[111] ,Key[111];
int jianzi[8] = {3 ,3 ,3 ,3 ,3 ,4 ,3 ,4}; char mk[8][4] =
{'a' ,'b' ,'c' ,'0' ,'d' ,'e' ,'f' ,'0',
'g' ,'h' ,'i' ,'0' ,'j' ,'k' ,'l' ,'0',
'm' ,'n' ,'o' ,'0' ,'p' ,'q' ,'r' ,'s',
't' ,'u' ,'v' ,'0' ,'w' ,'x' ,'y' ,'z'}; void Buid_Tree(char *str ,int vv)
{
int len = strlen(str);
Tree *p = &root ,*q;
for(int i = 0 ;i < len ;i ++)
{
int id = str[i] - 'a';
if(p -> next[id] == NULL)
{
q = (Tree *) malloc(sizeof(root));
q -> v = vv;
for(int j = 0 ;j < 26 ;j ++)
q -> next[j] = NULL;
p -> next[id] = q;
p = p -> next[id];
}
else
{
p = p -> next[id];
p -> v += vv;
}
}
} int Find(char *str)
{
int len = strlen(str);
Tree *p = &root;
int sum = 0;
for(int i = 0 ;i < len ;i ++)
{
int id = str[i] - 'a';
p = p -> next[id];
if(p == NULL) return -1;
sum += p -> v;
}
return p -> v;
} void DFS(int ii ,int n)
{
if(ii == n + 1) return;
for(int i = 0 ;i < jianzi[Key[ii] - 2] ;i ++)
{
now[ii-1] = mk[Key[ii] -2][i];
now[ii] = '\0';
int sum = Find(now);
if(sum == -1) continue;
if(sum > max[ii])
{
max[ii] = sum;
for(int j = 0 ;j <= ii ;j ++)
ans_str[ii][j] = now[j];
}
DFS(ii + 1 ,n);
}
} int main ()
{
int t ,n ,m ,i ,vv ,cas = 1;
char str[111];
scanf("%d" ,&t);
while(t--)
{
for(i = 0 ;i < 26 ;i ++)
root.next[i] = NULL;
scanf("%d" ,&n);
while(n--)
{
scanf("%s %d" ,str ,&vv);
Buid_Tree(str ,vv);
}
scanf("%d" ,&m);
printf("Scenario #%d:\n" ,cas ++);
while(m--)
{
memset(max ,255 ,sizeof(max));
scanf("%s" ,str);
int len = strlen(str);
int last = str[len-1] - '0';
for(i = 0 ,len --;i < len ;i ++)
Key[i+1] = str[i] - '0';
DFS(1 ,len);
for(i = 1 ;i <= len ;i ++)
if(max[i] == -1) puts("MANUALLY");
else puts(ans_str[i]);
puts("");
}
puts("");
}
return 0;
}
hdu 1298 字典树 + DFS (模拟T9文本输入)的更多相关文章
- HDU 1298 T9(字典树+dfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1298 题意:模拟手机9键,给出每个单词的使用频率.现在给出按键的顺序,问每次按键后首字是什么(也就是要概率最大的 ...
- HDU 1298 T9 字典树+DFS
必须要批评下自己了,首先就是这个题目的迟疑不定,去年做字典树的时候就碰到这个题目了,当时没什么好的想法,就暂时搁置了,其实想法应该有很多,只是居然没想到. 同样都是对单词进行建树,并插入可能值,但是拨 ...
- HDU 6191 2017ACM/ICPC广西邀请赛 J Query on A Tree 可持久化01字典树+dfs序
题意 给一颗\(n\)个节点的带点权的树,以\(1\)为根节点,\(q\)次询问,每次询问给出2个数\(u\),\(x\),求\(u\)的子树中的点上的值与\(x\)异或的值最大为多少 分析 先dfs ...
- hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs
题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...
- HDU1298 字典树+dfs
T9 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- HDU 5687 字典树插入查找删除
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...
- HDU 5384 字典树、AC自动机
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...
- POJ 1816 - Wild Words - [字典树+DFS]
题目链接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Time Limit ...
- hdu 2112(字典树+最短路)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- PHP Webshell List
目录 基础类 编码替换 无关键字函数类型 躲避检测记录 MySQL写入一句话 基础类 很容易被扫描.检测出来 <?php @eval($_GET['phpcode']);?> <?p ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...
- vs2019远程调试
VS2019远程调试 这几天遇到个很是纠结的问题,同样的源代码,放在测试服务器,完美运行.但是上线正式环境就是死活显示不出来.于是想到了微软的远程调试功能,这里用VS2019举例. 下载远程访问工具 ...
- 用vue.js实现的期货,股票的实时K线
用vue.js实现的期货,股票的实时k线 项目地址:https://github.com/zhengquantao/vue-Kline vue-kline 效果图 Build Setup 本项目基于V ...
- Python——input与raw_input的区别
区别一: raw_input():python2版本 input():python3版本 区别二: raw_input()不管是输数字还是字符串,结果都会以字符串的形式展现出来 input()则是 ...
- pandas函数高级
一.处理丢失数据 有两种丢失数据: None np.nan(NaN) 1. None None是Python自带的,其类型为python object.因此,None不能参与到任何计算中. #查看No ...
- WPF 基础 - DataTemplate
如果把控件的功能视为内容,则可以使用控件模板 ControlTemplate 来控制它的展现: 如果把数据视为内容,则可以使用数据模板 DataTemplate 把数据展示出来: ControlTem ...
- 翻译:《实用的Python编程》05_00_Overview
目录 | 上一节 (4 类和对象) | 下一节 (6 生成器) 5. Python 对象的内部工作原理 本节介绍 Python 对象的内部工作原理.来自其它语言的程序员通常会发现 Python 的类概 ...
- golang 三维向量相关操作
package vector import ( "math" "fmt" )// 三维向量:(x,y,z) type Vector3 struct { X fl ...
- 阿里一面CyclicBarrier和CountDownLatch的区别是啥
引言 前面一篇文章我们<Java高并发编程基础三大利器之CountDownLatch>它有一个缺点,就是它的计数器只能够使用一次,也就是说当计数器(state)减到为 0的时候,如果 再有 ...