`
java-mans
  • 浏览: 11741592 次
文章分类
社区版块
存档分类
最新评论

POJ 1451 字典树

 
阅读更多

这题的意思有点类似于一个输入法,就是按了一些键,蹦出单词库中频率最高的那个词汇

首先给出的是单词库,每个单词有一个出现频率。

然后给出的是一些询问,每个询问有一个字符串,代表在手机上按了哪些键,最后以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 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...

    使用字典树和Hashtable两种方法解POJ 2503(JAVA)

    标题中的“使用字典树和Hashtable两种方法解POJ 2503”是指通过这两种数据结构解决一个特定的编程问题。POJ是Programming Online Judge的缩写,它是一个在线的编程竞赛平台,用户可以提交代码来解决特定的算法问题。...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:Trie树(字典树)是一种用于存储和检索字符串的高效数据结构。 ### 三、动态规划 #### 1. 基本动态规划 - **例题**:poj2488, poj3083, poj3009, poj1321, poj2251 - **解释**:基本动态规划问题通常...

    poj 2564 Edit Step Ladders 解题报告

    POJ 2564是一道经典的字符串处理题目,涉及到动态规划(DP)与字典树(Trie Tree)的综合运用。题目要求通过一系列编辑操作将一个字符串转换为另一个字符串,每一步编辑操作可以是插入、删除或替换一个字符,并且要...

    acm训练计划(poj的题)

    6. **字典树(Trie)**: - (poj2513):一种高效的字符串检索数据结构。 ### 四、状态压缩 1. **状态压缩动态规划**: - (poj1837, poj1276):通过位运算来压缩状态,从而减少内存占用。 2. **背包问题**: - ...

    string-problem(POJ).rar_POJ 19_poj

    3. **POJ1951**:可能与字符串的排序有关,比如可以运用Manacher's Algorithm解决最长回文子串问题,或者需要理解并实现Trie(字典树)数据结构以优化字符串查找。 4. **POJ2003**:这可能是一个关于字符串编辑距离...

    POJ 分类题目 txt文件

    KMP算法用于在文本中查找模式字符串,AC自动机则适用于构建字符串匹配的字典树。例如,题目poj1961和poj2406就是KMP算法的应用实例。 ### 7. 几何算法 几何算法涉及点、线、面的性质和关系,如凸包、最近点对、...

    POJ2525-Text Formalization【TrieTree】

    今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie树(也称为前缀树或字典树)。这个题目来源于北京大学的在线判题系统POJ,旨在考察程序员对字符串处理和Trie树...

    经典 的POJ 分类

    #### 字典树 (Trie) - **题目示例**: - POJ 2513:Trie树的基本构造与查询。 ### 编程技巧 #### C++模板应用 - **题目示例**: - POJ 3096、POJ 3007:模板函数与类的灵活使用。 #### 特殊数据结构 - **题目...

    POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】

    【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...

    POJ1035-Spell checker 测试数据

    9. **字典构建与搜索**:为了实现拼写检查,可能需要创建一个高效的字典结构,如Trie树或哈希表,以便快速查找和比较单词。 10. **性能优化**:在竞赛环境中,程序的运行速度也很关键,因此可能需要优化代码,使其...

    POJ题目分类

    - **内容**: 字典树是一种高效的数据结构,主要用于存储字符串集合。 - **示例题目**: poj2513 - **知识点**: - **字典树的特点**:节省空间;查询速度快;方便实现自动补全功能。 #### 4. 哈希表 - **内容**: ...

    poj题目分类,关于acm/icpc

    2. **高级数据结构**:哈希表、堆(最大堆和最小堆)、 Trie 字典树、B树和B+树等。 3. **字符串处理**:模式匹配(KMP、Boyer-Moore、Rabin-Karp等)、字符串操作(子串查找、字符串比较等)。 4. **数学应用**:...

    poj(百练)题目分类

    - 字典树(Trie)的构建与查询。 - 字符串哈希的应用。 #### 3. 图论题 图论问题是算法竞赛中的重要组成部分,包括图的遍历、最短路径、最小生成树等问题。 - **知识点**: - 图的表示方法:邻接矩阵、邻接表。 -...

    ACMer需要掌握的算法讲解 (2).docx

    ACM算法讲解 本文将对ACM主要算法进行讲解,涵盖了基本算法、图算法、数据结构、搜索、计算几何学、动态规划和综合题等多方面的知识点。... + 字典树 + 后缀数组、后缀树 + 块状链表 + 哈夫曼树

    poj.grids.cn题型分类

    可以通过构建字典树或哈希表等方式来高效解决。 ##### 5. 棋盘分割 棋盘分割问题通常涉及将一个棋盘分割成若干个小区域,要求每个小区域满足一定的条件。可以通过动态规划定义状态`dp[i][j]`表示分割到第`i`行第`j...

    POJ2525–Text Formalization 测试数据

    在编程实践中,我们可以采用动态规划、贪心、分治等算法思想,结合数据结构如哈希表、Trie树、字典树等来提高效率。此外,利用已有的自然语言处理库,如NLTK、spaCy等,也可以简化某些步骤的实现。 总的来说,POJ...

    POJ3267-The Cow Lexicon

    这道题目主要涉及数据结构与算法的知识,特别是字符串处理和字典树(Trie)的应用。下面将详细阐述这个问题的背景、解题思路以及AC(Accepted)代码的关键部分。 ### 题目背景 在奶牛的世界里,它们也有自己的语言...

    ACMer需要掌握的算法讲解.docx

    ACMer 需要掌握的算法讲解 本资源摘要信息涵盖了 ACM 主要算法的介绍,包括基本算法、图算法、数据结构、搜索、计算几何学、动态规划、综合题等方面的...12. 字典树 13. 后缀数组、后缀树 14. 块状链表 15. 哈夫曼树

    北大、杭电ACM试题分类

    字典树是一种树形结构,用于高效地存储和检索字符键值。 ### 动态规划 1. **背包问题** - POJ 2488, POJ 3083, POJ 3009, POJ 1321, POJ 2251 背包问题是动态规划中的经典问题之一,涉及到如何选择物品放入...

Global site tag (gtag.js) - Google Analytics