http://acm.hdu.edu.cn/showproblem.php?pid=1298

题意:
模拟手机9键,给出每个单词的使用频率。现在给出按键的顺序,问每次按键后首字是什么(也就是要概率最大的)。

思路:

先建立字典树算出每个前缀出现的概率,然后dfs每种情况,选择概率大的。

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = *+; char s[],ans[],tmp[]; int n, num = , p;
int pheno[][] = {{,,},{,,},{,,},{,,},{,,},{,,,},{,,},{,,,}};
int key[] = {,,,,,,,}; struct Trie
{
int son[];
int cnt;
}t[maxn]; void init(int x)
{
t[x].cnt = ;
memset(t[x].son,,sizeof(t[x].son));
} void insert(char* s, int d)
{
int u = , n = strlen(s);
for(int i=;i<n;i++)
{
int c = s[i]-'a';
if(!t[u].son[c])
{
num++;
init(num);
t[u].son[c] = num;
}
u = t[u].son[c];
t[u].cnt += d;
}
} void dfs(int cur, int u, int len, char* s)
{
if(cur == len)
{
if(t[u].cnt > p)
{
p = t[u].cnt;
for(int i=;i<len;i++) ans[i] = tmp[i];
ans[len] = '\0';
}
return;
}
int k = s[cur]-'';
for(int i=;i<key[k];i++)
{
int c = pheno[k][i];
if(!t[u].son[c]) continue;
tmp[cur] = 'a'+ c;
dfs(cur+, t[u].son[c], len, s);
}
} int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
int kase = ;
while(T--)
{
init();
scanf("%d",&n);
for(int i =;i<n;i++)
{
scanf("%s%d",s,&p);
insert(s,p);
}
printf("Scenario #%d:\n",++kase);
int q; scanf("%d",&q);
while(q--)
{
scanf("%s",&s);
int len = strlen(s);
for(int i=;i<len-;i++)
{
p = ;
dfs(,,i+,s);
if(p) printf("%s\n",ans);
else puts("MANUALLY");
}
if(q) puts("");
}
printf("\n\n");
}
return ;
}

HDU 1298 T9(字典树+dfs)的更多相关文章

  1. HDU 1298 T9 字典树+DFS

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

  2. HDU 1298 T9 ( 字典树 )

    题意 : 给你 w 个单词以及他们的频率,现在给出模拟 9 键打字的一串数字,要你在其模拟打字的过程中给出不同长度的提示词,出现的提示词应当是之前频率最高的,当然提示词不需要完整的,也可以是 w 个单 ...

  3. hdu 1298 T9(特里+DFS)

    pid=1298" target="_blank" style="">题目连接:hdu 1298 T9 题目大意:模拟手机打字的猜想功能.依据概 ...

  4. hdu 1298 T9

    字典树+DFS. #include<cstdio> #include<cstring> #include<cmath> #include<string> ...

  5. hdu 1298 字典树 + DFS (模拟T9文本输入)

    题意:       给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...

  6. HDU 1298 T9【字典树增加||查询】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1298 T9 Time Limit: 2000/1000 MS (Java/Others)    Memo ...

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

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

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

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

  9. HDU1298 字典树+dfs

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

随机推荐

  1. numpy.random随机数生成

    seed 确定随机数生成器的种子 permutation 返回一个序列的随机排列或返回一个随机排列的返回 shuffle 对一个序列就地随机乱序 rand 产生均匀分布的样本值 randint 从给定 ...

  2. ETL面试题集锦

    1. What is a logical data mapping and what does it mean to the ETL team? 什么是逻辑数据映射?它对ETL项目组的作用是什么? 答 ...

  3. 如何删除自己上传的CSDN资源(亲测有效)

    今天发现有一个资源上传错了,想重新上传,删掉以前的资源,才发现CSDN并没有提供删除资源的功能,然后去网上搜了下,这才删除了,不知道怎么删除的小伙伴看过来~ 1.首先,找到自己想要删除资源的页面,举个 ...

  4. GAN的文献综述

    1.Conditional Generative Adversarial Netwoks Describe GAN: Generative adversarial nets were recently ...

  5. 怎样从外网访问内网MongoDB数据库?

    本地安装了一个MongoDB数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MongoDB数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MongoDB数据库 默认安装 ...

  6. 通过RMAN 识别失败数据库损坏的对象

    背景 业务起不来,读取数据库时报坏块,无法读取数据 数据库版本:11.2.0.3 数据库无备份,无归档 1. 识别坏块 执行以下命令后,rman 会把坏块信息统计到 v$database_block_ ...

  7. 2016 icpc ECfinal && codeforcesgym101194

    一不小心惨变旅游队,不过上海的风景不错 顺带找其他队交流一下集训经验...或许可以成为选拔和集训16级的依据 A.直接模3就可以了,2^(3*n)%7=1 C.Mr. Panda and Strips ...

  8. setfacl 设置文件访问控制列表

    setfacl 设置文件访问控制列表 用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... 参数: -m, --modify=acl 更改文件的访问控 ...

  9. python 之 函数的参数

    函数的参数好几种类型:包括位置参数.默认参数.可变参数.关键字参数.命名关键字参数. 廖大神python学习笔记,大神网站:百度搜索“廖雪峰的官网” 1.位置参数:调用函数时根据函数定义的参数位置来传 ...

  10. VC++ 获取Windows系统版本号、CPU名称

    转载:https://blog.csdn.net/sunflover454/article/details/51525179 转载:https://blog.csdn.net/magictong/ar ...