hdu-(1298手机相关 dfs+字典树)

题目大意:
在以前,手机输入法很麻烦,因为只有9个键,而字母有26个,所以一个键上同时包含这几个字母,这样的话,为了打出一个字母可能要按几次。比如键5有“JKL”,
如果要输入K,那么就要连按两次。
这样的输入法很麻烦。所以一家公司发明了T9技术输入法。这种输入法内置这很多英语单词,它可以根据英语出现的频率,是否存在等信息,每个字母只要按一次,就可以有想要的预选单词。
例如,假设输入法只内置了一个单词“hell”, 那么只需要按4355便可以出来。 注意,如果有一个单词hell, 那么这个单词的所有前缀,h, he, hel,
也当作是存在的

Sample Input

2 5 hell 3 hello 4
idea 8 next 8 super 3 2 435561 43321 7 another 5 contest 6 follow 3 give 13
integer 6 new 14 program 4 5 77647261 6391 4681 26684371 77771

Sample Output

Scenario #1: i id
hel hell hello i id ide idea Scenario #2: p pr pro prog progr progra program n
ne new g in int c co con cont anoth anothe another p pr MANUALLY MANUALLY

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

const int KIND = 26;
const int MAXN = 15000;
int cnt_node;

vector<int>g[10];
char input[105];
char ans[105];
int num, Max;
bool flag;

struct node{
int prefix;
node *next[KIND];
void init(){
prefix=0;
memset(next, 0, sizeof(next));
}
}Heap[MAXN];

inline node* newNode(){
Heap[cnt_node].init();
return &Heap[cnt_node++];
}
void insert(node *root, char *str, int n){
for(char *p=str; *p; ++p){
int ch=*p-‘a‘;
if(root->next[ch]==NULL)
root->next[ch] = newNode();
root = root->next[ch];
root->prefix += n;
}
}
void dfs(node *root, char *str, int pos){ //str保存输出结果
if(root==NULL)return;
if(pos >= num){
if(root->prefix > Max){
strcpy(ans, str);
Max=root->prefix;
}
flag=true;
return ;
}
int u=input[pos]-‘0‘;
for(int i=0; i<g[u].size(); ++i){
str[pos] = g[u][i]+‘a‘;
dfs(root->next[g[u][i]], str, pos+1);
str[pos] = 0;
}
}

int main(){
int T,n,p,cas=1;
char str[105];

// 键盘设置, 貌似这样写复杂了...
for(int i=0; i<10; ++i) g[i].clear();
g[2].push_back(0), g[2].push_back(1), g[2].push_back(2);
g[3].push_back(3), g[3].push_back(4), g[3].push_back(5);
g[4].push_back(6), g[4].push_back(7), g[4].push_back(8);
g[5].push_back(9), g[5].push_back(10), g[5].push_back(11);
g[6].push_back(12), g[6].push_back(13), g[6].push_back(14);
g[7].push_back(15), g[7].push_back(16), g[7].push_back(17),g[7].push_back(18);
g[8].push_back(19), g[8].push_back(20), g[8].push_back(21);
g[9].push_back(22), g[9].push_back(23), g[9].push_back(24), g[9].push_back(25);

scanf("%d",&T);
while(T--){
scanf("%d",&n);
printf("Scenario #%d:\n", cas++);

// Trie init
cnt_node=0;
node *root = newNode();

for(int i=0; i<n; ++i){
scanf("%s %d",str,&p);
insert(root, str, p);
}

scanf("%d",&n);
for(int i=0; i<n; ++i){
scanf("%s", input);
for(int j=0; j<strlen(input)-1; ++j){
memset(str, 0, sizeof(str));
Max=-1;
num=j+1;
flag=false;
dfs(root, str, 0);
if(flag) puts(ans);
else puts("MANUALLY");
}
puts("");
}
puts("");
}
return 0;
}

hdu-(1298手机相关 dfs+字典树)

时间: 2024-08-10 02:54:50

hdu-(1298手机相关 dfs+字典树)的相关文章

hdu 1247 Hat’s Words 字典树

// hdu 1247 Hat's Words 字典树 // // 题目大意: // // 在一些字符串中,找到这样字符串:由两个其他的字符串构成 // // 解题思路: // // 字典树,先将这些字符串插入到字典树中,然后枚举断点,如果 // 字符串的前后两段都找到了,输出该串即可~ // // 感悟: // // 这道题目的话,就是字典树上的暴力嘛,细节方面还是要多多注意 // val值还是不能少哟~因为查找到了该串,不一定是一个单词,可能 // 是中间的一个节点,即某个字符串的前缀~~~

[ACM] hdu 1251 统计难题 (字典树)

统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每一个提问都是一个字符串. 注意:本题仅仅有一组測试数据,处理到文件结束. Out

HDU 2094 产生冠军 (字典树+拓扑)

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8591    Accepted Submission(s): 4047 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打

hdu 1979 DFS + 字典树剪枝

http://acm.hdu.edu.cn/showproblem.php?pid=1979 Fill the blanks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 373    Accepted Submission(s): 155 Problem Description There is a matrix of 4*4, yo

hdu 4757 Tree(可持久化字典树)

题目链接:hdu 4757 Tree 题目大意:给定一棵树,每一个节点有一个值.如今有Q次询问,每次询问u到v路径上节点值与w亦或值的最大值. 解题思路:刚開始以为是树链剖分,事实上树链剖分仅仅是用来求LCA(能够不用树链剖分). 可持久化字典树.在每次插入的同一时候,不改动原先的节点.而是对全部改动的节点复制一个新的节点,而且在新的节点 上做操作,这样做的目的是可以获取某次改动前的状态.同过可持久化的操作,保留了改动前后的公共数据. 对给定树上的全部节点权值建立01字典树,然后每一个节点都保存

HDU 4287 Intelligent IME(字典树数组版)

Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4776    Accepted Submission(s): 2227 Problem Description We all use cell phone today. And we must be familiar with the intelligen

HDU 1251 统计难题(字典树 裸题 链表做法)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提

hust1350Trie【字典树+dfs || 字典树 + LCA】

大意:告诉你一些字符串 让你组成字典树, 然后定义每个节点到所有叶子节点的距离的和等于改点的value 当根节点只有一个孩子,该根节点也算一个叶子节点 问所有节点的value的最小值 分析: 开始做的时候  就想的是   枚举每个点  然后求它到所有叶子节点的和  求任意两点的最近距离  用公共祖先来求 于是就有了这个算法 需要预处理出来所有的叶子节点 不能单纯的用字典树的flag来记录  例如插入aaa aa a  那么 a  aa aaa 都会被当成叶子节点 对于这里的处理 我是排了一次序

HDU 1251 统计难题(字典树模板题 || map运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一