HDU1075 字典树 + 字符串映射

时间:2022-12-30 13:26:46

  题目链接: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;
}