luogu 3907 :Trie 树板子(dalao勿看,水的辣眼睛)

题意:给出N(<=10000)个单词,单词长度小于等于20。在给出一个串T,要求按照字典序输出所有输入串中以T为前缀的串。注意同相同的串可能有多个。

题解:对N个串造一个Trie树,然后拿着T在树上跑,如果T串失败了,那么直接退出。T匹配到了某个Node,然后从这个Node开始DFS就可以了。

Code:

#include<bits/stdc++.h>
using namespace std;
const int MAX = 1000;
char buff[MAX],delta[MAX];
struct Trie_Node{
    Trie_Node * nxt[26];
    int exist;
};
Trie_Node * root;
Trie_Node * Trie_Create(){
    Trie_Node * node =(Trie_Node*)(malloc(sizeof(Trie_Node)));
    node->exist = false;
    memset(node->nxt,0,sizeof(node->nxt));
    return node; 
} 
void Trie_Insert(Trie_Node * root,char * word){
    Trie_Node * node = root;
    char * p = word;
    while (*p){
        int id = *p -'a';
        if (node->nxt[id]==NULL){
            node->nxt[id] = Trie_Create();
        }
        node = node->nxt[id];
        p++;
    } 
    node->exist++;
}
void Trie_Dfs(Trie_Node * node,int length){
    for (int i=0;i<(node->exist);i++){
        printf("%s",buff);
        delta[length] ='\0';
        printf("%s\n",delta);
    }
    for (int i=0;i<=25;i++){
        if (node->nxt[i]!=NULL){
            delta[length] = i+'a';
            Trie_Dfs(node->nxt[i],length+1);
        }
    } 
}
void Trie_Search(Trie_Node * root,char * word){
    Trie_Node* node = root;
    char * p = word;
    while (*p){
        int id = *p-'a';
        node = node->nxt[id];
        if (node==NULL){
            return;
        }
        p++;
    }
    Trie_Dfs(node,0);
}
int main(){
    root = Trie_Create();
    int n;
    scanf("%d\n",&n);
    while (n--){
        scanf("%s",buff);
        Trie_Insert(root,buff);
    }
    scanf("%s",buff);
    Trie_Search(root,buff);
    return 0;
}

    原文作者:Trie树
    原文地址: https://blog.csdn.net/calabash_boy/article/details/77015426
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞