题意:

      给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方

法好好看看别弄错了,一开始就是因为弄错了,各种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文本输入)的更多相关文章

  1. HDU 1298 T9(字典树+dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1298 题意:模拟手机9键,给出每个单词的使用频率.现在给出按键的顺序,问每次按键后首字是什么(也就是要概率最大的 ...

  2. HDU 1298 T9 字典树+DFS

    必须要批评下自己了,首先就是这个题目的迟疑不定,去年做字典树的时候就碰到这个题目了,当时没什么好的想法,就暂时搁置了,其实想法应该有很多,只是居然没想到. 同样都是对单词进行建树,并插入可能值,但是拨 ...

  3. HDU 6191 2017ACM/ICPC广西邀请赛 J Query on A Tree 可持久化01字典树+dfs序

    题意 给一颗\(n\)个节点的带点权的树,以\(1\)为根节点,\(q\)次询问,每次询问给出2个数\(u\),\(x\),求\(u\)的子树中的点上的值与\(x\)异或的值最大为多少 分析 先dfs ...

  4. hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs

    题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...

  5. HDU1298 字典树+dfs

    T9 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  6. HDU 5687 字典树插入查找删除

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...

  7. HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...

  8. POJ 1816 - Wild Words - [字典树+DFS]

    题目链接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Time Limit ...

  9. hdu 2112(字典树+最短路)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. jq日期与时间戳互相转换

    方法1:$.extend({ myTime: { CurTime: function () { return Date.parse(new Date()) / 1000; }, DateToUnix: ...

  2. POJ-1182(经典带权并查集)

    食物链 POJ-1182 一个很好的分析博客:https://blog.csdn.net/niushuai666/article/details/6981689 三种关系:两者同类,吃父节点,被父节点 ...

  3. GNS3通过“云”连接到虚拟机实验

    GNS3通过"云"连接到虚拟机实验并使用wireshark工具对数据分析 观看本文之前注意!!!!! 做这次实验,我所遇到的问题,会全部写在文章结尾,如果读者们遇到问题,可查看. ...

  4. 远程文件管理系统(SpringBoot + Vue)

    一.简介 可以实现对本地文件的 增.删.改.重命名等操作的监控,通过登录远程文件监控系统,获取一段时间内本地文件的变化情况. 系统功能图如下: 流程图如下: 二.本地文件监控程序的实现(C++) 调用 ...

  5. BZOJ_2844 albus就是要第一个出场 【线性基】

    一.题目 albus就是要第一个出场 二.分析 非常有助于理解线性基的一题. 构造线性基$B$后,如果$|A| > |B|$,那么就意味着有些数可以由$B$中的数异或出来,而多的数可以取或者不取 ...

  6. POJ1562_Oil Deposits(JAVA语言)

    思路:bfs.水题,标记下计数就完了. Oil Deposits Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22928 ...

  7. Java系列教程-Spring 教程目录

    Spring 教程目录 可参考MyBatis的官方文档也比较清楚 https://mybatis.org/mybatis-3/zh/getting-started.html 代码 目录 https:/ ...

  8. Day1---Java 基本数据类型 - 四类八种 --九五小庞

    一.Java四大数据类型分类 1.整型 byte .short .int .long 2.浮点型 float . double 3.字符型 char 4.布尔型 boolean 二.八种基本数据类型 ...

  9. JS基础学习第六天

    数组(Array) 数组也是一个对象,它和普通的对象一样,也是用来存储一些值的,不同的是普通对象是使用字符串作为属性名的,而数组使用数字作为索引来操作元素数组的存储性能比普通对象好,再开发中我们经常使 ...

  10. JS基础学习第三天

    条件分支语句switch语句语法: 1234567891011121314 switch(条件表达式){ case 表达式: 语句... break; case 表达式: 语句... break; c ...