HDU1075 字典树 + 字符串映射

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 ,字典树的字符串映射。

  



  题意是给你每个火星文单词对应的英语,然后让你把一篇火星文文章给翻译成英语。

解法:

  在Trie树的每个结束标志处加一个字符串,这样就可以对每个火星文单词构造映射。构造映射后就可以处理翻译部分,可以用gets读入一行,然后对这一行进行处理,注意标点符号的情况。最后还有注意数组开大点。

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
const int maxn = 500000 + 5;
const int sigma_size = 26;
struct Trie {
    int ch[maxn][sigma_size];
    char str[maxn][15];
    bool isEnd[maxn];
    int size;
    void init() {
        size = 1;
        memset(ch[0] , 0 , sizeof(ch[0]));
        memset(isEnd , 0 , sizeof(isEnd));
    }
    int index(char c) {    return c - ‘a‘;    }
    void insert(char *s , char *s0) {
        int i , rt;
        for(i = rt = 0 ; s[i] != ‘\0‘ ; i++) {
            int c = index(s[i]);
            if(!ch[rt][c]) {
                memset(ch[size] , 0 , sizeof(ch[size]));
                ch[rt][c] = size++;
            }
            rt = ch[rt][c];
        }
        strcpy(str[rt] , s0);
        isEnd[rt] = 1;
    }
    char *find(char *s) {
        int i , rt;
        for(i = rt = 0 ; s[i] != ‘\0‘ ; i++) {
            int c = index(s[i]);
            if(!ch[rt][c])
                return "0";
            rt = ch[rt][c];
        }
        return (isEnd[rt]) ? str[rt] : "0";
    }
} trie;
char s1[maxn] , s2[maxn];
int main()
{
    trie.init();
    while(~scanf("%s" , s1)) {
        if(!strcmp(s1 , "START"))    continue;
        if(!strcmp(s1 , "END"))        break;
        scanf("%s" , s2);
        trie.insert(s2 , s1);
    }
    getchar();
    while(gets(s1)) {
        if(!strcmp(s1 , "START"))    continue;
        if(!strcmp(s1 , "END"))        break;
        int i = 0;
        while(s1[i] != ‘\0‘) {
            if(s1[i] >= ‘a‘ && s1[i] <= ‘z‘) {
                int j = 0;
                while(s1[i] != ‘\0‘ && s1[i] >= ‘a‘ && s1[i] <= ‘z‘) {
                    s2[j++] = s1[i++];
                }
                s2[j] = ‘\0‘;
                char *tmp = trie.find(s2);
                if(tmp[0] == ‘0‘)    printf("%s" , s2);
                else                printf("%s" , tmp);
            } else {
                putchar(s1[i++]);
            }
        }
        puts("");
    }
    return 0;
}
时间: 2024-10-06 00:40:14

HDU1075 字典树 + 字符串映射的相关文章

[转载]Trie树|字典树(字符串排序)

有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英文字典一样,相邻的单词一般前缀相同,之所以时间复杂度低,是因为其采用了以空间换取时间的策略. 下图为一个针对字符串排序的Trie树(我们假设在这里字符串都是小写字母),每个结点有26个分支,每个分支代表一个字母,结点存放的是从root节点到达此结点的路经上的字符组成的字符串. 将每个字符串插入到tr

poj 2513 Colored Sticks(欧拉通路+并查集+字典树)

题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色,现在给定每个木棍两端的颜色,不同木棍之间拼接需要颜色相同的 端才可以,问最后能否将N个木棍拼接在一起. 解题思路:欧拉通路+并查集+字典树.欧拉通路,每个节点的统计度,度为奇数的点不能超过2个.并查集,判断节点 是否完全联通.字典树,映射颜色. #include <cstdio> #include <cstring> #include <string> #includ

字符串hash与字典树

title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是简单的套模板的东西,,,理解基本思想就行了,,,对了,,还有一个字典树的的变形--01字典树: 字符串hash 如何求一个字符串的hash值 字符串hash的作用就是将 字符串有效的转化为一个整数 ,,这个转化过程利用的是一个 hash函数 例如,,我们选hash函数为 \(hash[i]=(has

UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量

/** 题目:UVALive 7712 Confusing Manuscript 链接:https://vjudge.net/problem/UVALive-7712 题意:给定n个不同的字符串,f(i)表示第i个字符串和其他字符串的编辑距离为1的个数. 编辑距离为1表示两个字符串其中一个可以通过删除任意位置某一个字符或者增加任意位置某一个字符或者替换任意位置某一个字符之后,两者匹配. 输出f(i)最大的字符串,如果f(i)==f(j) (i<j) 输出第i个字符串. 思路:字典树 主要是处理细

【字符串算法】字典树Trie入门

基本概念 顾名思义,字典树(也叫前缀树)就是可以像字典那样来保存一些单词的集合. 如图所示: (图片来自OIWiKi) 设根节点的标号为$0$,然后其余结点依次编号:我们用数组来存每个节点的所有子节点 更具体地,设数组$ch[MaxNode][SigmaSize]$,其中$MaxNode$表示最大可能的节点个数,$SigmaSize$是字符集合.$ch[i][j]$表示结点标号为$i$的结点 的 字母编号为$j$(比如说,j=字母-'a')的子节点的结点标号.如果$ch[i][j]$为$0$,则

【数据结构】字典树/Trie树/前缀树 - 字符串的统计、排序和保存

字典树 描述 字典树,又称单词查找树.Trie树.前缀树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计.排序和保存大量的字符串(但不仅限于字符串). 常见操作有插入和查找,删除操作少见. 性质 根节点不包含字符 除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 每个节点的所有子节点包含的字符都不相同 优点 利用字符串的公共前缀来减少查询时间 最大限度地减少无谓的字符串比较 查询效率比哈希树高 自带字典序排序 直接判断重复,或者记

Tire树(字典树)

from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交叉. 定义 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有

POJ2513(字典树+图的连通性判断)

//用map映射TLE,字典树就AC了#include"cstdio" #include"set" using namespace std; const int MAXN=510005; const int N=26;//26个小写英文字母 struct node{ int val;//存放字符串的hash值 node* next[N]; }; node memory[MAXN]; int ant; node* root; node* create_tree() {

hdu 1075 What Are You Talking About 字典树 trie

What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others) Total Submission(s): 14703    Accepted Submission(s): 4724 Problem Description Ignatius is so lucky that he met a Martian yesterday. But