hdu 1298 T9

简介: 点击打开链接hdu 1298 题意:题目说的是在那遥远的星球有一款叫诺基亚的手机,键盘采用题目的图的样式。给定n个单词的出现的概率,规定是相加的比如hell出现为4,hello概率为3则hell的概率为7。

点击打开链接hdu 1298

题意:题目说的是在那遥远的星球有一款叫诺基亚的手机,键盘采用题目的图的样式。给定n个单词的出现的概率,规定是相加的比如hell出现为4,hello概率为3则hell的概率为7。现在给定m次输入的格式,根据概率问每一次输入能够得到的字符串是什么

思路:我们把n个单词建立成一棵字典树,然后我们对每一次的输入进行搜索,因为一个数字对应有好几种的可能值,然后把概率最大的字符串保存为ans即可
代码:

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

const int MAXN = 1010;
const int N = 110;
const int M = 26;

struct Node{
    int mark;
    Node* child[M];
};
Node node[MAXN*N];
Node* root;

int pos , maxVal;
char ans[N];
int map[] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};

Node* newNode(){
    node[pos].mark = 0;
    for(int i = 0 ; i < M ; i++)
        node[pos].child[i] = NULL;
    return &node[pos++];
}

void insert(char *str , int p){
    Node* s = root;
    int len = strlen(str);
    for(int i = 0 ; i < len ; i++){
        int num = str[i]-'a';
        if(s->child[num] == NULL)
            s->child[num] = newNode();
        s = s->child[num]; 
        s->mark += p;
    }
}

void search(Node* s , char* str , char *tmp , int pos , int len){
    if(s == NULL)
        return;
    if(pos == len){
        if(s->mark > maxVal){
            maxVal = s->mark;
            memcpy(ans , tmp , sizeof(ans));
        }
        else if(s->mark == maxVal){
            if(strcmp(ans , tmp) > 0)
               memcpy(ans , tmp , sizeof(ans));
        }
        return; 
    }
    int num = str[pos]-'0';
    for(int i = 0 ; i < M ; i++){
        if(map[i] == num){
            tmp[pos] = i+'a';
            search(s->child[i],str,tmp,pos+1,len);
            tmp[pos] = '\0';
        }
    }
}

void solve(){
    int n;
    char str[N];
    char tmp[N];
    char tmpAns[N];
    scanf("%d" , &n);
    while(n--){
        scanf("%s" , str);
        int len = strlen(str)-1;
        for(int i = 0 ; i < len ; i++){
            memcpy(ans , "MANUALLY" , sizeof(ans));            
            memcpy(tmp , str , sizeof(tmp));
            tmp[i+1] = '\0';
            maxVal = 0;
            memset(tmpAns , '\0' , sizeof(tmpAns));
            search(root , tmp , tmpAns , 0 , i+1);
            printf("%s\n" , ans);
        }
        puts("");
    }
}

int main(){
    int cas , m , p;
    int Case = 1;
    char str[N];
    scanf("%d" , &cas);
    while(cas--){
        printf("Scenario #%d:\n" , Case++);
        pos = 0;
        root = newNode();
        scanf("%d" , &m);
        for(int i = 1 ; i <= m ; i++){
            scanf("%s %d" , str , &p);
            insert(str , p);
        }
        solve();
        puts("");
    }
    return 0;
}



目录
相关文章
|
Ubuntu 安全 网络安全
百度搜索:蓝易云【Ubuntu系统SVN服务器搭建教程】
现在,你已经成功在Ubuntu系统上搭建了SVN服务器。其他用户可以通过SVN客户端连接到你的SVN服务器,进行代码版本管理和协作开发。注意,为了安全起见,建议配置SSL加密以保护数据传输。
238 1
|
7月前
TOP5免费国内外WordPress主题测评
本文介绍了5款优秀的WordPress主题,包括专为公司设计的免费主题Corporate Blue、极简风格的企业主题Angle、适合数字媒体公司的Monochrome Pro、带有全屏视频背景的Inspiro以及针对旅游行业的Cousteau Pro。每个主题都具备独特功能和自定义选项,满足不同网站需求。通过主题预览图可直观了解其样式与布局,方便用户选择合适的方案。内容来源于Wordpress主题相关资源。
232 4
|
应用服务中间件 nginx
安装nginx-rtmp-module模块与配置
安装nginx-rtmp-module模块与配置
|
自然语言处理 算法 测试技术
模型的多语言能力
模型的多语言能力
|
小程序 JavaScript Java
美术馆预约小程序|基于微信小程序的美术馆预约平台设计与实现(源码+数据库+文档)
美术馆预约小程序|基于微信小程序的美术馆预约平台设计与实现(源码+数据库+文档)
198 2
|
移动开发 前端开发 项目管理
基于jeecg-boot的nbcio-boot亿事达企业管理平台发布
基于jeecg-boot的nbcio-boot亿事达企业管理平台发布
240 0
|
Linux 编译器 C++
Linux centOS 编译C/C++
Linux centOS 编译C/C++
|
Web App开发 API
在机器人流程自动化(RPA)中,判断网页或元素是否加载完成是一个重要的步骤
【2月更文挑战第24天】在机器人流程自动化(RPA)中,判断网页或元素是否加载完成是一个重要的步骤
740 6
|
Android开发
Android 使用UDP进行通讯(发送数据和接收数据)
Android 使用UDP进行通讯(发送数据和接收数据)
2318 0
|
程序员 Linux Shell
【CSAPP】进程控制 | 系统调用错误处理 | 进程状态 | 终止进程 | 进程创建 | 回收子进程 | 与子进程同步(wait/waitpid) | execve 接口
【CSAPP】进程控制 | 系统调用错误处理 | 进程状态 | 终止进程 | 进程创建 | 回收子进程 | 与子进程同步(wait/waitpid) | execve 接口
459 0