zoukankan      html  css  js  c++  java
  • 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] != '' ; 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] != '' ; 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] != '') {
                if(s1[i] >= 'a' && s1[i] <= 'z') {
                    int j = 0;
                    while(s1[i] != '' && s1[i] >= 'a' && s1[i] <= 'z') {
                        s2[j++] = s1[i++]; 
                    }
                    s2[j] = '';
                    char *tmp = trie.find(s2);
                    if(tmp[0] == '0')    printf("%s" , s2);
                    else                printf("%s" , tmp);
                } else {
                    putchar(s1[i++]);
                }
            }
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    【JAVA与C#比较】其它
    C#和java之间的一些差异与共性
    C#与Java的语法差异
    关于npm本地安装模块包(node_modules),安装不了的问题
    vue
    vue
    vue
    vue
    v
    vue -model
  • 原文地址:https://www.cnblogs.com/H-Vking/p/4472247.html
Copyright © 2011-2022 走看看