POJ 1451 T9(字典树+bfs)

VS2017配置PCL1.9.1 for win10(超详细) 准备工作 VS2017 自行下载 PCL1.9.1 点击链接跳转Github下载,根据自己的环境选择 win64或win32,作者下载的是:PCL-1.9.1-AllInOne-msvc2017-win64.exepcl-1.9.1-pdb-msvc2017-win64.zip 安装PCL 双击点开PCL-1.9.1-AllInOne-msvc2017-win64.exe,选择Add PCL to the system PATH for all users, 更改安装路径,E:\Progra 阅读详情

背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词。

题意:

首先给出的是字典,每个单词有一个出现频率。然后给出的是询问,每个询问有一个数字字符串,代表在手机上按了哪些键,以1结束。问按键的过程中最可能出现的单词分别是哪些。

注意:hell的权值为hell hello hellmoun 的权值和。
即一个字符串前缀的概率等于所有前缀之和。
还有就是一个单词在输入法中,这个单词的所有前缀也在输入法中。

解析:

字典树来搞这道题目,可以把所有的字符串都插入字典树中,然后bfs这颗字典树,找到当前层权最大的节点,并输出该路径。

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;
const int maxnode = 1005 * 105;
const int sigma_size = 26;
string T9[10];

int ch[maxnode][sigma_size];
int fa[maxnode];
char alpha[maxnode];
int val[maxnode];


int idx(int c) { return c - 'a'; }

struct Trie {
    int sz;
    void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
    Trie() { clear(); }

    void insert(char *s, int p) {
        int u = 0, n = strlen(s);
        for(int i = 0; i < n; i++) {
            int c = idx(s[i]);
            if(!ch[u][c]) {
                memset(ch[sz], 0, sizeof(ch[sz]));
                val[sz] = 0;
                fa[sz] = u;
                alpha[sz] = c + 'a';
                ch[u][c] = sz++;
            }
            u = ch[u][c];
            val[u] += p;
        }
    }
} trie;

void init() {
    T9[0] = ""; T9[1] = "";
    T9[2] = "abc"; T9[3] = "def";
    T9[4] = "ghi"; T9[5] = "jkl";
    T9[6] = "mno"; T9[7] = "pqrs";
    T9[8] = "tuv"; T9[9] = "wxyz";
}

void dfs(int u) {
    if(u == 0) return ;
    dfs(fa[u]);
    putchar(alpha[u]);
}

struct Node {
    int u, step;
    Node(int u, int step) : u(u), step(step) {}
};

int bfs(char* s, int len) {
    queue<Node> que;
    que.push(Node(0, -1));

    int maxp = -1, ret = -1;
    int u, step;
    while(!que.empty()) {
        Node front = que.front();
        que.pop();

        u = front.u, step = front.step;
        if(step > len) continue;
        if(step == len && val[u] > maxp) {
            maxp = val[u];
            ret = u;
        }

        int num = s[step+1] - '0';
        for(int i = 0; i < T9[num].size(); i++) {
            int c = idx(T9[num][i]);
            if(ch[u][c]) {
                int v = ch[u][c];
                que.push(Node(v, step+1));
            }
        }
    }
    return ret;
}

int n, m, p;
char str[105];

int main() {
    init();
    int T, cas = 1;
    scanf("%d", &T);
    while(T--) {
        trie.clear();
        scanf("%d", &n);
        while(n--) {
            scanf("%s%d", str, &p);
            trie.insert(str, p);
        }
        scanf("%d", &m);
        printf("Scenario #%d:\n", cas++);
        while(m--) {
            scanf("%s", str);
            int len = strlen(str);
            for(int i = 0; str[i] != '1'; i++) {
                int u = bfs(str, i);
                if(u == -1) {
                    puts("MANUALLY");
                }else {
                    dfs(u);
                    puts("");
                }
            }puts("");
        }puts("");
    }
    return 0;
}
ESP32 LVGL开发板例程使用记录:自制常用汉字字库(二) 1、将下载的文件移入工程文件中 ,路径为项目文件中 ”......\lib\lvgl\src\font“文件夹下。3、修改字库配置文件,文件名为lv_conf.h中的内容,向其中加入下面内容(位置可搜索注释块来找到地方)修改完成可以编译试试,看是否成功,如字库较大时编译出错,请使能:LV_FONT_FMT_TXT_LARGE。2、打开此文件,修改包含头文件的路径,不然会报错,修改方法可对照自己库中其他字库文件中的包含路径。导入完成后在VSCode工程中可以查看到此文件。上次说完了如何制作 字库.c 文件。 阅读详情

相关推荐

ROS2 Jazzy 学习路线图(2026最新)

摘要: ROS2 Jazzy(LTS版)是2026年长期支持版本,仅适配Ubuntu 24.04。本文提供WSL环境下的学习路线图: 环境搭建(1-2天):配置WSL2+Ubuntu 24.04,安装ROS2 Jazzy及图形工具(VcXsrv、VS Code)。 核心概念(3-5天):掌握节点、话题、服务等通信机制,使用turtlesim和小海龟仿真实践。 开发实战(7-10天):Python/C++节点开发,结合RViz2、Gazebo等工具完成多节点通信和避障项目。 进阶应用(10-15天):导航(N

zheng_ruiguo的专栏 548

数据结构:字典树

字典树一、字典树介绍二、字典树实战 字典树类似于二叉树,内部结构并不复杂,在前缀方面百试百灵,却没有红黑树,AVL那么多变化,赶紧码起来 一、字典树介绍 字典树并不是死的,其内部其实是多变的,在介绍中会讲解可能的变式 1、定义结点 与二叉树一样,结点需要存储其数据,以及下一个结点的,若结点中只包含字母,我们有两种方法连接到next结点 HashMap型:Node中用hashmap来连接到下一个结点,适用于字母类型少的情况 数组型:Node中用数组来连接到下一个结点,适用于字母类型多的情况 privat

mlgseminent的博客 245

wsl --install 不执行,显示帮助信息

在安装使用wsl的时候碰到了wsl --install 不执行,而显示帮助信息,提供了解决方案。

水滴爬呀爬 2697

【Java数据结构与算法】字典树(前缀树) 用法及相关题目解题思路

字典树基本概念结构,字典树相关题解,单词拆分、添加与搜索单词、单词搜索、连接词题目解题思路、技巧。DFS BFS应用等

ly甲烷的博客 655

Poj1451

题目大意:给你一个手机字典,让你根据用户的输入键号对应找到输入次数最多的那一个单词并输出。 算法思想:字典树的应用,仙剑好字典树,再便利用户的输入,运用递归找到最优数组,并输出, #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; using namespace std; int t,m,w,...

huyifan1的博客 377

POJ 1451(0ms)(dnf)(树的灵活建立)

翻译看这里:#include #include #define clr(x) memset(x, 0, sizeof(x)) struct Tree { int count; Tree *next[26]; Tree() { count = 0; for(int i = 0; i < 26; ++i) n

julicliy的博客 272

CSU 2023 Bless You Autocorrect! (字典树+BFS

大致题意,给出单词表,然后让你拼写一个单词。可以支持手动输入字符,手动删除字符和摁下空格键键入单词表中与当前输入串前缀相同的第一个单词。三种操作的代价都是1,现在给出一些单词,对于每个单词输出打出单词的最小代价。 首先,字典树是肯定可以想到的,当时想法是对于每一个节点弄一个first节点,指向与当前点表示串前缀相同的第一个单词的下一个字母的节点,但是这样子处理代价的时候不好统计。其实正解已经很近了。对于每一个节点,考虑连接一条边指向经过当前表示串前缀相同的第一个单词的末端节点,并且建立一个f

alpc_qleonardo 744

POJ 1451 T9 (map, 字典树, bfs)

T9这道题是前几天看的,看了别人的代码也没仔细看,没看明白。题意比较简单,就是模拟手机智能英语输入法。字符串匹配基本是用字典树实现的,但看有人用map也能过,就先用map试了。核心部分是一个bfs,开始这部分就没想明白,想了好几天,最后还是看别人的代码基本差不多了,自己写一个果然可以了。基本思路是先把所有的单词和其子串存入,并记录其优先值,如果有重复优先值累加。然后

431

短信智能输入 Trie POJ 1451 T9

http://poj.org/problem?id=1451 背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词。 题意: 首先给出的是字典,每个单词有一个出现频率。然后给出的是询问,每个询问有一个数字字符串,代表在手机上按了哪些键,以1结束。问按键的过程中最可能出现的单词分别是哪些。 注意:hell的权值为

ACM_10000h的专栏 690

POJ 1451

POJ  1451          本题实质是对智能英语单词输入法的模拟,开门见山,题目的主要的思想就是 bfs (广度优先搜索),然后选择一种数据结构,这快推荐用 字典树 ,我用了 stl 中的优先队列,自己写太麻烦,stl 好用。        对每个序列产生,存入优先队列的头总是当前最优的单词,然后将其打印,具体代码如下:#include #include #include #include #include #define Maxsize 1000 using namespa

AKsoftware的专栏 1055

字典树的使用 poj1451字典树+BFS+剪枝)

一、先简单的介绍一下字典树(一下关于字典树的介绍的内容来自互联网) trie的性质真的是相当的好,而且实现比较简单。它使在字符串集合中查找某个字符串的操作的复杂度降到最大只需O(n),其中n为字符串的长度。trie是典型的将时间置换为空间的算法,好在ACM中一般对空间的要求很宽松。 trie的原理是利用字符串集合中字符串的公共前缀来降低时间开销以达到提高效率的目的。它具有以下性质:1,

zhouy869的专栏 700

POJ 2697 字典树 + bfs

这题一点都不难啊 ,不知道为什么这么少人过 像这种题,一看就是BFS,然后需要记录状态是否被访问过 要么你就hash  要么你就塞到字典树里 状态很少 , 也就C(16, 4) * C(12, 4)90多万个 然后BFS就行了 需要注意一个条件,题目要求的是先动白子,再动黑子,然后再白子,这样交替着来。 #include #include #include #incl

1875

HDU多校 - three arrays(字典树+bfs

HDU多校 - three arrays(字典树+bfs) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6625 题意 给出两个数组A,B求任意交换A数组中的顺序和B数组中的数组,求两者对应异或的C数组字典序最小 数据范围: 1≤N≤1051\le N \le 10^51≤N≤105 思路 我们将A数组的数据全部转换成为01串,插入字典树A中,...

qq_41848675的博客 331

HDU 1430 魔板 康托展开或字典树 + BFS

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1430题意:Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列

弱智就要多努力 798

三个水杯(bfs+字典树

三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。 输入第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,...

weixin_30898109的博客 190

POJ 1451 字典树

这题的意思有点类似于一个输入法,就是按了一些键,蹦出单词库中频率最高的那个词汇 首先给出的是单词库,每个单词有一个出现频率。 然后给出的是一些询问,每个询问有一个字符串,代表在手机上按了哪些键,最后以1结束。问进行这些按键的过程中出现的单词分别是哪些。 思路就是字典树了。 以手机的8个键做8个指针来建立字典树。 每个结点存的除了指针外,还有出现频率最高的单词。 建树的时候需要注意,每个...

java开发指南博客 【转载】 238

Poj 1451 JAVA 个人解题报告

AC 时间 334ms,内存 3000k 题目大意: 模拟手机键盘的九宫格输入模式,每当输入单词,就会显示可能的单词, 根据每个单词的可能性。 这个可能性就是输入列表里跟随每个单词后面的那个正整数。 单词前缀一致的情况下,可能性可以叠加,且只在公用的前缀的字符上叠加, 分支的字符是保持原样的。 按照一定顺序的数字输入, 输出所有可能性的组合。 解题思路: 和前缀有关,字典树

qq_28052721的博客 327

S - T9

Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] Description

mr_lee 724

Trie树; 模拟了一个简单的输入法;

#include using namespace std;//Trie Node structurestruct TrieNode{ bool isStr; char word[20]; //模拟拼音输入法 TrieNode* next[26]; TrieNode() { isStr=false;

总是在想,如果我能坚持2年,会是怎样? 991

Trie树(基础操作)

trie树+BFS+链表,调了一个世纪,然后发现这是个爆空间的写法,气死我了。 Trie树: 概念什么的,度娘比较厉害。 一棵树,26叉树,子节点都代表字符。 我觉得吧,这就是将字符串用树的方式存储,以便于操作。忽略根结点,那么第一层就都是字符串的第一个字母,第二层是第二个,以此类推。例如字符串“achq”就可以存储成这样 如果再加入一个字符串“abcd”这棵树就变成了这样 根...

dsakhdkas的博客 3349

POJ1451 - 字典树的变型

上个周末给学校新队员上课...很是紧张..周日那场想来现场coding..就是很简单的高精度加法...结果怯场了..还是狐狸大大上来救了我..好丢人~~囧..这一向状态一直怪怪的~~这道题起码卡了三天吧~~其实这三天也是招新各种事~~没多大心思来做题~~昨天晚上终于把这题搞定了~~     题意就是说给一个字典...并同时给出每个单词的出现次数...是想一下手机的输入法...然后按手机的输入一串

zzyzzy12 1332

期货软件指标文华财经指标公式源码期货指标缠论123买卖点主图公式.doc

期货软件指标文华财经指标公式源码期货指标缠论123买卖点主图公式.doc

Acronis Backup Advanced(服务器备份工具)注册版 V11.7.50088

Acronis Backup Advanced 专为大型企业环境设计,为环境中的所有系统提供世界级的保护和快速灵活的灾难恢复,而无论该环境的复杂性;支持:异机还原、集中式管理、业务应用程序保护、多重备份目标、云备份等;仅支持Windows Server服务器系统安装,支持列表:Windows Server 2003--Windows Server 2016

上一篇: hdu 5351 MZL's Border(打表+高精度)
下一篇: Codeforces Round #Pi (Div. 2) (ABCD)
HelloWorld10086
博客等级 码龄12年 88粉丝 614原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值