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 ...
随机推荐
- createNewFile() 报错 open failed: ENOENT (No such file or directory) 的解决方案
在写Android应用中使用createNewFile() 遇到open failed: ENOENT (No such file or directory) 错误,在网上查了许多方法,不过都不能解决 ...
- Gym100923H Por Costel and the Match
题目链接:http://codeforces.com/gym/100923/problem/H 分析:并查集,用enemy储存x的敌人,用weight储存权重决定根节点 需用scanf和puts输入输 ...
- 02----python入门----基本数据类型
关于数据分类依据 一.数字型(int) Python可以处理任意大小的正负整数,但是实际中跟我们计算机的内存有关,在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,在64位系 ...
- 漫漫Java路1—基础知识2—注释和命名规则
## 注释 1. 单行注释 ```java //这是一个注释 ``` 2. 多行注释 ```java /* 这是一个注释 */ ``` 3. 文档注释 ```java /** * * * */ ``` ...
- Android实现三角形气泡效果方式汇总
在开发过程中,我们可能会经常遇到这样的需求样式: 这张图是截取京东消息通知的弹出框,我们可以看到右上方有个三角形的气泡效果,这只是其中一种,三角形的方向还可以是上.下.左.右. 通过截图可以发现,气泡 ...
- vue项目安装sass步骤等遇到的问题
1.安装sass依赖包 npm install --save-dev sass-loader 注释(可能会出现问题:sass-loader版本过高导致,可以将其package.json中的版本改为7. ...
- XUPT-D
/* 泰泰学长又来玩数字了,泰泰学长想让你帮他求1-n的和,但是这次的求和可不是简单的1+2+...+n. 这次的求和是这样的,如果加到一个数字是2的指数倍,那就不加,反而减掉这个数. ...
- python-实现输出乘法口诀表
list1 = [1,2,3,4,5,6,7,8,9] 2 def number(num): 3 for i in list1[:num]: 4 result = 1 * i 5 print(&quo ...
- JWT加密解密方法
public static string Key { get; set; } = "123456789987654321";//解密串 /// <summary> // ...
- IDApro 快捷键
https://www.hex-rays.com/wp-content/static/products/ida/idapro_cheatsheet.html File Operations Parse ...