• poj 2503 Babelfish (trie)


    思路很简单,对foreign language word建trie树,插入时一并传入word的序号,与english word相对应。查找时直接查找word标记的序号,从存储数组中输出englishword就好了。

    比较蛋疼的是这题的输入,一开始真心搞不定啊。。搞定后直接1Y。

    code:

    #include<cstdio>
    #include<cstring>
    char str[100001][11] ;//模式串
    char estr[100001][11] ;
    #define MAX 26 //字符集大小
    typedef struct TrieNode{
        int no ;
        int count ; //记录该字符出现次数
        struct TrieNode *next[MAX] ;
    }TrieNode ;

    TrieNode Memory[1000000] ;
    int allocp = 0 ;

    /*初始化*/
    void InitTrieRoot(TrieNode **pRoot){
        *pRoot = NULL ;
    }

    /*创建新结点*/
    TrieNode *CreateTrieNode(){
        int i ;
        TrieNode *p ;

        p = &Memory[allocp++] ;
        p->count = 1 ;
        for(i=0; i<MAX; i++){
            p->next[i] = NULL ;
        }
        return p ;
    }

    /*插入*/
    void InsertTrie(TrieNode **pRoot, char *s, int no){
        int i, k ;
        TrieNode *p ;
        if(!(p=*pRoot)){
            p = *pRoot = CreateTrieNode() ;
        }
        i = 0 ;
        while(s[i]){
            k = s[i++] - 'a' ; //确定branch
            if(p->next[k]){
                p->next[k]->count ++ ;
                p->next[k]->no = no ;
            }
            else{
                p->next[k] = CreateTrieNode() ;
                p->next[k]->no = no ;
            }
            p = p->next[k] ;
        }
    }

    //查找
    int SearchTrie(TrieNode **pRoot, char *s){
        TrieNode *p ;
        int i , k ;

        if(!(p=*pRoot))
            return -1 ;
        i = 0 ;
        while(s[i]){
            k = s[i++] - 'a' ;
            if(p->next[k]==NULL)    return -1 ;
            p = p->next[k] ;
        }
        return p->no ;
    }
    int main(){
        char s[11] ;
        int n = 0, i=1 ;
        allocp = 0 ;
        TrieNode *root = NULL ;
        InitTrieRoot(&root) ;
        scanf("%c", &estr[i][0]) ;
        while(scanf("%s%s", estr[i]+1, s)){
            getchar() ;
            InsertTrie(&root, s, i++) ;
            scanf("%c", &estr[i][0]) ;
            if(estr[i][0]=='\n'break ;
        }
        while(~scanf("%s", s)){
            int ans = SearchTrie(&root, s) ;
            if(ans==-1) printf("eh\n") ;
            else    printf("%s\n", estr[ans]) ;
        }
        return 0 ;} 
  • 相关阅读:
    GCC编译器原理(三)------编译原理三:编译过程(3)---编译之汇编以及静态链接【2】
    xmind转为markdown
    XMind破解
    读取字符串中的数字
    "Cannot declare member function ...to have static linkage"错误
    error: cannot bind non-const lvalue reference of type
    (C++ Error: Incompatible types in assignment of ‘char*’ to ‘char [2])
    C++中的map
    17 jQuery阶段_操作样式_操作属性_动画_节点操作
    第一部分:网络多任务_day01_网络编程基础
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2341978.html
Copyright © 2020-2023  润新知