HDU 1298 T9 字典树+DFS
必须要批评下自己了,首先就是这个题目的迟疑不定,去年做字典树的时候就碰到这个题目了,当时没什么好的想法,就暂时搁置了,其实想法应该有很多,只是居然没想到。
同样都是对单词进行建树,并插入可能值,但是拨号键盘上的字母是对应多个的,给定拨号序列,有多种可能情况 输出其中最可能的一种,肯定要想到搜索啊,而且拨号数目不超过100,每个按键最多只对应4个字母,复杂度并不高,所以用dfs是可行的,对于每次递归深度,dfs找到最大的可能值的情况并输出。
接下来就是要批评自己了,下午一点钟开始做这个题目,居然被一个小bug搞了一个多小时,都没过样例,就是我的dfs写挫了,而且我迟迟没找到原因。。。真的要反省自己的代码编写能力了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int tot;
char s[];
char press[][];
char num[];
int ansd;
char anss[],finds[];
bool flag;
struct node
{
node* ch[];
int cur,deep;
} tree[];
node* newNode()
{
node* p;
p=&tree[tot++];
for (int i=;i<;i++)
{
p->ch[i]=NULL;
}
p->cur=;
p->deep=;
return p;
}
void insertn(node* root,char* s1,int fee)
{
node* p=root;
int i=,k;
//puts(s1);
while (s1[i])
{
k=s1[i]-'a';
if (p->ch[k]==NULL)
{
//cout<<s1[i]<<" "<<p->deep<<endl;
p->ch[k]=newNode();
}
p->ch[k]->deep=i++;
p->ch[k]->cur+=fee;
p=p->ch[k];
}
}
void init()
{
strcpy(press[],"abc");
strcpy(press[],"def");
strcpy(press[],"ghi");
strcpy(press[],"jkl");
strcpy(press[],"mno");
strcpy(press[],"pqrs");
strcpy(press[],"tuv");
strcpy(press[],"wxyz"); }
void dfs(node* rt,char* s1,int maxd,int d)
{
node* p=rt;
if (d==maxd)
{
if (p->cur>ansd){
flag=;
ansd=p->cur;
for (int i=;i<d;i++)
anss[i]=finds[i];
anss[d]='\0';
}
return;
}
int k=s1[d]-'';
for (int i=;press[k][i];i++)
{ int q=press[k][i]-'a';
if (p->ch[q]!=NULL)
{
finds[d]=press[k][i];
}
else
continue; dfs(p->ch[q],s1,maxd,d+);
}
}
void test(node* root)
{
node* p=root;
for (int i=;i<;i++)
{
char c=i+'a';
cout<<c<<" "<<i<<endl;
if (p->ch[i]!=NULL) puts("Yes");
else puts("NO");
if (p->ch[i]!=NULL){
// cout<<c<<" "<<p->deep<<endl;
// p=p->ch[i];
//test(p);
}
}
}
int main()
{
//freopen("d:\\hdu_1298.txt","w",stdout);
int t,w,p,m,a,kase=;
scanf("%d",&t);
init();
while (t--)
{
tot=;
node* root=newNode();
root->deep=-;
scanf("%d",&w);
for (int i=;i<w;i++)
{
scanf("%s %d",s,&p);
//puts(s);
//cout<<root->deep<<endl;
//node*r1=root;
//cout<<root->deep<<endl;
insertn(root,s,p);
//cout<<root->deep<<endl;
} //test(root);
scanf("%d",&m);
printf("Scenario #%d:\n",++kase);
for (int i=;i<m;i++)
{
scanf("%s",num);
//puts(num);
ansd=;
flag=false; int len=strlen(num);
for (int i=;i<len;i++)
{
ansd=;
if (flag||i==){
flag=false;
dfs(root,num,i,);
}
if (flag)
puts(anss);
else
puts("MANUALLY");
}
printf("\n");
}
printf("\n");
}
return ;
}
HDU 1298 T9 字典树+DFS的更多相关文章
- HDU 1298 T9 ( 字典树 )
题意 : 给你 w 个单词以及他们的频率,现在给出模拟 9 键打字的一串数字,要你在其模拟打字的过程中给出不同长度的提示词,出现的提示词应当是之前频率最高的,当然提示词不需要完整的,也可以是 w 个单 ...
- hdu 1298 T9(特里+DFS)
pid=1298" target="_blank" style="">题目连接:hdu 1298 T9 题目大意:模拟手机打字的猜想功能.依据概 ...
- hdu 1298 T9
字典树+DFS. #include<cstdio> #include<cstring> #include<cmath> #include<string> ...
- HDU 1298 T9(字典树+dfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1298 题意:模拟手机9键,给出每个单词的使用频率.现在给出按键的顺序,问每次按键后首字是什么(也就是要概率最大的 ...
- hdu 1298 字典树 + DFS (模拟T9文本输入)
题意: 给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...
- HDU 1298 T9【字典树增加||查询】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1298 T9 Time Limit: 2000/1000 MS (Java/Others) Memo ...
- 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 ...
随机推荐
- 011、MySQL取14天前Unix时间戳
#取14天前时间戳 SELECT unix_timestamp( DATE_SUB( curdate( ), INTERVAL DAY ) ); 效果如下: 不忘初心,如果您认为这篇文章有价值,认同作 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:SortedMap类
import java.util.Map ; import java.util.SortedMap ; import java.util.TreeMap ; public class SortedMa ...
- LeetCode141 环形链表(Java—HashSet简单应用or双指针)
题目: 判断给出的链表中是否存在环. 思路: 1. 遍历整个链表,将走过的节点的内存地址保存下来,如果再次走到同样的内存地址,说明链表中有环.时间复杂度为O(n). 2. 设置两个指针,fast指针每 ...
- STM32初始
.安装软件.驱动 JLINK驱动.PL2303驱动.MDK4.7(装完破解) .源码编译完要用到的工具 烧录工具MCUISP.串口调试助手 .KEIL建工程模板(2种) (1)寄存器开发:工程文件夹下 ...
- Redis 详解 (一) redis的简介和安装
目录 1.Redis 的简介 2.Redis 下载 3.安装环境 4.编译安装 5.启动Redis 6.关闭Redis 7.注意事项 工作中一直在用 Redis,但是一直没有进行系统的总结,这个系列的 ...
- 九十九、SAP中ALV事件之十二,给ALV的标题栏添加图片
一.在OAER中找一个喜欢的图片,对象标识为“TRVPICTURE04” 二.来到我们的代码区,输入代码 三.效果如下 很完美
- 七、JavaScript之console.log输出和document.write输出
一.代码如下 二.运行效果如下 三.点击之后,效果如下 四.按一下F12,在控制台中可以看到
- 笔记本如何不按Fn键就能实现F键的功能
笔记本的F1~F12键的附带功能如何改成 不用按Fn键就能实现F1~F12的功能 本人现在使用的是一款ThinkPad的本本,之前在台式机上愉快的玩耍的时候键盘上的F键直接按一下就可以实现相应的功能, ...
- Assignment写作谨慎学术抄袭是关键
学术写作(Academic Writing)作为留学生涯的“必修课”,总是让闻者叹气,抓耳挠腮.初入课堂的留学生,更是缺乏写作经验不知从何下笔,只想仰天长啸“Essay真的好难啊!!”面对一个Essa ...
- PHP数组创建和遍历(基础)
数组定义PHP数组可以是混合数组 你的数组里面可以有数字也可以有字符串,二维数组不谈一个数组里还有数组跟C有差别定义方式例如 $dd=array(array(1,2,3),array(1,2,3,4) ...