• poj 2001 Shortest Prefixes (trie)



    拿到这题,大致的画了画图,发现只要标记好每个节点出现的次数就好了。 

    插入时,若字符存在,n++,若不存在建立新节点,他本身也为自己的前缀。

    查找时,若next[k]->nCount!=1,说明其子节点有多个,无法确定唯一,则输出该字符,若nCount=1,则可以结束查找了。

    code:

    #include<cstdio>
    #include<cstring>

    char str[1001][21] ;
    #define MAX 30 //字符集大小
    typedef struct TrieNode{
        int nCount ; //记录该字符出现次数
        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->nCount = 1 ;
        for(i=0; i<MAX; i++){
            p->next[i] = NULL ;
        }
        return p ;
    }

    /*插入*/
    void InsertTrie(TrieNode **pRoot, char *s){
        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]->nCount ++ ;
            else
                p->next[k] = CreateTrieNode() ;
            p = p->next[k] ;
        }
    }

    //查找
    void SearchTrie(TrieNode **pRoot, char *s){
        TrieNode *p ;
        p = *pRoot ;
        int i , k ;
        i = 0 ;
        while(s[i]){
            k = s[i++] - 'a' ;
            if(p->next[k]==NULL||p->next[k]->nCount==1){
                printf("%c", k+'a') ;
                break ;
            }
            else{
                p = p->next[k] ;
                printf("%c", k+'a') ;
            }
        }
        printf("\n") ;
    }
    int main(){
        int n = 0, i ;
        allocp = 0 ;

        TrieNode *root = NULL ;
        InitTrieRoot(&root) ;

        while(gets(str[n])&&str[n][0])
            InsertTrie(&root, str[n++]) ;
        for(i=0; i<n; i++){
            printf("%s ", str[i]) ;
            SearchTrie(&root, str[i]) ;
        }
        return 0 ;

  • 相关阅读:
    lightdb特性之内置数据库规范检查和违约拦截
    lightdb匿名块及其事务支持
    PHP系列 | PHP中的stdClass是什么?
    霍金斯能量层级图解析 辉
    golang 解释器
    golang 1.18 plugin 热更新|插件化终极方案 2022经验实战总结
    WSL connect: Network is unreachable解决方案
    Git 修改文件后,文件夹目录层级未显示红色
    Apache Hudi 源码分析 JavaClient
    【ESXi】失败 – “scsi0:0”的磁盘类型 2 不受支持或无效。请确保磁盘已导入
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2341872.html
Copyright © 2020-2023  润新知