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

分析 : 利用字典树存储这 w 个单词,然后给每一个结点的权值赋上其单词出现频率,接下来的工作就简单多了,只要暴力枚举模拟输入的数字键盘可能产生的单词组合,然后保存频率最高的那个即可!

#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
;
, n, m;
const int INF = 0x3f3f3f3f;
]{ ///模拟数字键盘,因为是从2开始,所以0和1都赋值上一个'@'代表空
    {'@','@','@','@','@'},
    {'@','@','@','@','@'},
    {'a','b','c','@','@'},
    {'d','e','f','@','@'},
    {'g','h','i','@','@'},
    {'j','k','l','@','@'},
    {'m','n','o','@','@'},
    {'p','q','r','s','@'},
    {'t','u','v','@','@'},
    {'w','x','y','z','@'}
};

struct Trie
{
    Trie *Next[maxn];
    int v;
    inline void init(const int val){
        this->v = val;
        ; i<maxn; i++)
            this->Next[i] = NULL;
    }
};
Trie *root;

void CreateTrie(char *str, int val)
{
    int len = strlen(str);
    Trie *p = root, *tmp;
    ; i<len; i++){
        int idx = str[i]-'a';

        if(p->Next[idx] == NULL){
            tmp = (Trie *)malloc(sizeof(Trie));
            tmp->init(val);
            p->Next[idx] = tmp;
        }else (p->Next[idx]->v) += val;///赋上频率权值

        p = p->Next[idx];
    }
}

inline void DelTrie(Trie *T)
{
    if(T == NULL) return ;
    ; i<maxn; i++){
        if(T->Next[i] != NULL)
            DelTrie(T->Next[i]);
    }
    free(T);
    return ;
}

], ans[], now[];
int tmp, MaxVal;

void DFS(int pos, int len, Trie *NOD)
{
    if(pos == len){///递归出口,看看频率是否更优,更新答案
        if(NOD->v > MaxVal){
            strcpy(ans, now);
            MaxVal = NOD->v;
        }
        return ;
    }
    ';

    ; mp[idx][i]!='@'; i++){///枚举这个数字建的所有字母,遇到'@'结束
        int id = mp[idx][i] - 'a';
        if(NOD->Next[id]){ ///如果字典树关于这个字母的节点不为空的话,则进一步搜索
            now[pos] = mp[idx][i];///now是保存一下暂时现在构造出来的字符串,以便更新
            now[pos+] = '\0';
            DFS(pos+, len, NOD->Next[id]);///进一步搜索
        }
    }
}

int main(void)
{
    int nCase;
    scanf("%d", &nCase);

    ; Case<=nCase; Case++){
        root = (Trie *)malloc(sizeof(Trie));
        root->init();
        scanf("%d", &n);
        int tmpVal;
        ; i<n; i++){
            scanf("%s %d", str, &tmpVal);
            CreateTrie(str, tmpVal);
        }
        printf("Scenario #%d:\n", Case);
        scanf("%d", &m);

        ; i<m; i++){
            scanf("%s", str);
            int len = strlen(str);

            ; j<len; j++){///枚举长度
                MaxVal = -INF;
                DFS(, j, root);
                if(MaxVal == -INF) puts("MANUALLY");
                else puts(ans);
            }
            puts("");
        }puts("");
        DelTrie(root);
    }
    ;
}

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

  1. HDU 1298 T9 字典树+DFS

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

  2. hdu 1298 T9(特里+DFS)

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

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

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

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

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

  5. POJ 1451 - T9 - [字典树]

    题目链接:http://bailian.openjudge.cn/practice/1451/ 总时间限制: 1000ms 内存限制: 65536kB 描述 Background A while ag ...

  6. hdu 1979 DFS + 字典树剪枝

    http://acm.hdu.edu.cn/showproblem.php?pid=1979 Fill the blanks Time Limit: 3000/1000 MS (Java/Others ...

  7. hdu 2846(字典树)

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

  8. HDU 2846 Repository (字典树 后缀建树)

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

  9. HDU 1671 (字典树统计是否有前缀)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671 Problem Description Given a list of phone number ...

随机推荐

  1. 【Linux开发】直接渲染管理

    原文地址:https://dri.freedesktop.org/wiki/DRM/ DRM - Direct Rendering Manager DRM是一个内核级的设备驱动,既可以编译到内核中也可 ...

  2. [DS+Algo] 002 一维表结构

    目录 1. 顺序表 1.1 分类 1.2 实现方式 1.3 扩容问题 1.4 操作 2. 链表 2.1 分类 2.2 链表相关操作 2.3 链表 VS 顺序表 3. 关于代码实现 1. 顺序表 1.1 ...

  3. c++ Oracle OCCI 编程

    转载备忘:http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 关于occi编程可以参考的链接: http://blog.itpub.net/162 ...

  4. React全家桶入门

    http://blog.csdn.net/column/details/14545.html

  5. class path resource [applicationContext.xml] cannot be opened because it does not exis

    使用maven创建web工程,将spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...

  6. Docker其他操作:查看内部细节、IP、删除容器

    1.查看容器内部细节 查看容器运行内部细节,比如可看容器的IP docker inspect mycentos2 2.查看容器IP地址 直接显示IP地址 docker inspect --format ...

  7. 算法学习之二分查找算法的python实现

    ——参考自<算法图解> 我们假设需要查找的数组是有序的(从大到小或者从小到大),如果无序,可以在第四行后插入一句 my_list.sort() 完整代码如下 def binary_sear ...

  8. Spring基础02——Spring HelloWorld

    1.首先我们来创建一个HelloWorld类,通过Spring来对这个类进行实例化 package com.wzy.lesson1; /** * @author wzy * @version 1.0 ...

  9. 使用Medusa美杜莎暴力破解SSH密码

    使用Medusa美杜莎暴力破解SSH密码 1.Medusa简介 Medusa(美杜莎)是一个速度快,支持大规模并行,模块化的爆力破解工具.可以同时对多个主机,用户或密码执行强力测试.Medusa和hy ...

  10. 2019 计蒜之道 复赛 E. 撑起信息安全“保护伞” (贪心,构造,规律)

    为了给全球小学员打起信息安全"保护伞",VIPKID 还建立了一套立体化的安全防御体系,7 \times 247×24 小时持续安全监控与应急响应等多项联动,具备业界最高级别的数据 ...