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 ...
随机推荐
- KMP(超详细复杂度分析)
从 stackoverflow中找到了一个时间复杂度分析很棒的链接 https://www.inf.hs-flensburg.de/lang/algorithmen/pattern/kmpen.htm ...
- PAT-1154(Vertex Coloring )+map使用+vector建图+set的使用
Vertex Coloring PAT-1154 #include<iostream> #include<cstring> #include<string> #in ...
- java 方法详解
什么是方法 方法的定义和调用 值传递与引用传递 值传递:指的是在方法调用时,传递的是参数是按值的拷贝传递. 特点:传递的是值的拷贝,也就是传递后就互不相关了. 引用传递:指的是在方法调用时,传递的参数 ...
- Shiro 反序列化漏洞利用
环境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 # 80 ...
- java将数据生成csv文件
1,httpRequest接口触发进程[或者可以换成其他方式触发] /** * 出入库生成CSV文件 * @param req * @param params * @return */@Request ...
- C# 通过ServiceStack 操作Redis——Set类型的使用及示例
ServiceStack 程序集里面没有方法注解,我在这里将注解添加上去,有不当之处,欢迎指正 Console.WriteLine("---Set类型---"); //添加 set ...
- Error message: Failed to spawn: unable to access process with pid 413 due to system restrictions; try `sudo sysctl kernel.yama.ptrace_scope=0`, or run Frida as root
Android 8.0 在frida中使用 -f 参数报错, Error message: Failed to spawn: unable to access process with pid 413 ...
- 【MCU】国民N32固件库移植
目录 前言 移植N32Gxxx系列要点 前言 链接: 李柱明博客 移植AT32库&FreeRTOS教程 由于大部分国产MCU移植固件库.RTOS源码都是差不多的,所以本文不讲细节,如想熟悉移植 ...
- Java中的面向切面编程(AOP)
一.什么是AOP? Aspect Oriented Programming ,即面向切面编程. AOP是对面向对象编程的一个补充. 它的目的是将复杂的需求分解为不同的切面,将散布在系统中的公共功能集中 ...
- 计划任务统一集中管理系统cronsun(替代crontab)
一.背景 crontab 是 Linux 系统里面最简单易用的定时任务管理工具,相信绝大多数开发和运维都用到过,很多业务系统的定时任务都是通过 crontab 来定义的,时间长了后会发现存在很多问题: ...