这题的意思有点类似于一个输入法,就是按了一些键,蹦出单词库中频率最高的那个词汇
首先给出的是单词库,每个单词有一个出现频率。
然后给出的是一些询问,每个询问有一个字符串,代表在手机上按了哪些键,最后以1结束。问进行这些按键的过程中出现的单词分别是哪些。
思路就是字典树了。
以手机的8个键做8个指针来建立字典树。
每个结点存的除了指针外,还有出现频率最高的单词。
建树的时候需要注意,每个相同的前缀只能插入一次,否则就没法处理。
所以插入之前,把所有相同前缀的频率值都加起来 ,插入的时候插一次就好了,每次更新最优值就行。
题目给的输入是已经排好序的,也就省了我们排序的时间。因为前缀相同的肯定在一块,所以挨个同相邻的比较就行了、
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define eps 1e-5
#define MAXN 1111
#define MAXM 55555
#define INF 1000000000
using namespace std;
int c[1005][105], e;
char s[1005][105];
char tmp[105];
char dic[] = "22233344455566677778889999";
struct Trie
{
int next[8];
int num;
char s[105];
void init ()
{
memset(next, 0, sizeof(next));
num = 0;
}
} trie[MAXM];
void make_trie (char *str, int id)
{
int i = 0, index, u = 0;
while(str[i])
{
index = dic[str[i] - 'a'] - '2';
if(!trie[u].next[index]) trie[u].next[index] = ++e;
u = trie[u].next[index];
if(c[id][i] > trie[u].num)
{
trie[u].num = c[id][i];
for(int j = 0; j <= i; j++) trie[u].s[j] = s[id][j];
trie[u].s[i + 1] = '\0';
}
i++;
}
}
void match(char *str)
{
int i = 0, index, u = 0, flag = 0;;
while(str[i] && str[i] != '1')
{
index = str[i] - '2';
u = trie[u].next[index];
if(trie[u].num == 0 || u == 0 || flag) printf("MANUALLY\n"), flag = 1;
else printf("%s\n", trie[u].s);
i++;
}
}
int main()
{
int T, n, p, m, cas = 0;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(c, 0, sizeof(c));
for(int i = 0; i < n; i++)
{
scanf("%s%d", s[i], &p);
int len = strlen(s[i]);
for(int j = 0; j < len; j++) c[i][j] = p;
}
for(int i = 1; i < n; i++)
for(int j = 0; s[i][j] && s[i - 1][j]; j++)
{
if(s[i][j] == s[i - 1][j])
{
c[i][j] += c[i - 1][j];
c[i - 1][j] = 0;
}
else break;
}
for(int i = 0; i < MAXM; i++) trie[i].init();
e = 0;
for(int i = 0; i < n; i++) make_trie(s[i], i);
scanf("%d", &m);
printf("Scenario #%d:\n", ++cas);
while(m--)
{
scanf("%s", tmp);
match(tmp);
printf("\n");
}
printf("\n");
}
return 0;
}
分享到:
相关推荐
标题中的“字典树练习 POJ 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...
标题中的“使用字典树和Hashtable两种方法解POJ 2503”是指通过这两种数据结构解决一个特定的编程问题。POJ是Programming Online Judge的缩写,它是一个在线的编程竞赛平台,用户可以提交代码来解决特定的算法问题。...
- **解释**:Trie树(字典树)是一种用于存储和检索字符串的高效数据结构。 ### 三、动态规划 #### 1. 基本动态规划 - **例题**:poj2488, poj3083, poj3009, poj1321, poj2251 - **解释**:基本动态规划问题通常...
POJ 2564是一道经典的字符串处理题目,涉及到动态规划(DP)与字典树(Trie Tree)的综合运用。题目要求通过一系列编辑操作将一个字符串转换为另一个字符串,每一步编辑操作可以是插入、删除或替换一个字符,并且要...
6. **字典树(Trie)**: - (poj2513):一种高效的字符串检索数据结构。 ### 四、状态压缩 1. **状态压缩动态规划**: - (poj1837, poj1276):通过位运算来压缩状态,从而减少内存占用。 2. **背包问题**: - ...
3. **POJ1951**:可能与字符串的排序有关,比如可以运用Manacher's Algorithm解决最长回文子串问题,或者需要理解并实现Trie(字典树)数据结构以优化字符串查找。 4. **POJ2003**:这可能是一个关于字符串编辑距离...
KMP算法用于在文本中查找模式字符串,AC自动机则适用于构建字符串匹配的字典树。例如,题目poj1961和poj2406就是KMP算法的应用实例。 ### 7. 几何算法 几何算法涉及点、线、面的性质和关系,如凸包、最近点对、...
今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie树(也称为前缀树或字典树)。这个题目来源于北京大学的在线判题系统POJ,旨在考察程序员对字符串处理和Trie树...
#### 字典树 (Trie) - **题目示例**: - POJ 2513:Trie树的基本构造与查询。 ### 编程技巧 #### C++模板应用 - **题目示例**: - POJ 3096、POJ 3007:模板函数与类的灵活使用。 #### 特殊数据结构 - **题目...
【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...
9. **字典构建与搜索**:为了实现拼写检查,可能需要创建一个高效的字典结构,如Trie树或哈希表,以便快速查找和比较单词。 10. **性能优化**:在竞赛环境中,程序的运行速度也很关键,因此可能需要优化代码,使其...
- **内容**: 字典树是一种高效的数据结构,主要用于存储字符串集合。 - **示例题目**: poj2513 - **知识点**: - **字典树的特点**:节省空间;查询速度快;方便实现自动补全功能。 #### 4. 哈希表 - **内容**: ...
2. **高级数据结构**:哈希表、堆(最大堆和最小堆)、 Trie 字典树、B树和B+树等。 3. **字符串处理**:模式匹配(KMP、Boyer-Moore、Rabin-Karp等)、字符串操作(子串查找、字符串比较等)。 4. **数学应用**:...
- 字典树(Trie)的构建与查询。 - 字符串哈希的应用。 #### 3. 图论题 图论问题是算法竞赛中的重要组成部分,包括图的遍历、最短路径、最小生成树等问题。 - **知识点**: - 图的表示方法:邻接矩阵、邻接表。 -...
ACM算法讲解 本文将对ACM主要算法进行讲解,涵盖了基本算法、图算法、数据结构、搜索、计算几何学、动态规划和综合题等多方面的知识点。... + 字典树 + 后缀数组、后缀树 + 块状链表 + 哈夫曼树
可以通过构建字典树或哈希表等方式来高效解决。 ##### 5. 棋盘分割 棋盘分割问题通常涉及将一个棋盘分割成若干个小区域,要求每个小区域满足一定的条件。可以通过动态规划定义状态`dp[i][j]`表示分割到第`i`行第`j...
在编程实践中,我们可以采用动态规划、贪心、分治等算法思想,结合数据结构如哈希表、Trie树、字典树等来提高效率。此外,利用已有的自然语言处理库,如NLTK、spaCy等,也可以简化某些步骤的实现。 总的来说,POJ...
这道题目主要涉及数据结构与算法的知识,特别是字符串处理和字典树(Trie)的应用。下面将详细阐述这个问题的背景、解题思路以及AC(Accepted)代码的关键部分。 ### 题目背景 在奶牛的世界里,它们也有自己的语言...
ACMer 需要掌握的算法讲解 本资源摘要信息涵盖了 ACM 主要算法的介绍,包括基本算法、图算法、数据结构、搜索、计算几何学、动态规划、综合题等方面的...12. 字典树 13. 后缀数组、后缀树 14. 块状链表 15. 哈夫曼树
字典树是一种树形结构,用于高效地存储和检索字符键值。 ### 动态规划 1. **背包问题** - POJ 2488, POJ 3083, POJ 3009, POJ 1321, POJ 2251 背包问题是动态规划中的经典问题之一,涉及到如何选择物品放入...