HDU1247Hat’s Words(字典树)

题目链接

解题报告:

静态分配是比动态分配省时的。

静态分配耗时:

动态分配耗时:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 26

typedef struct TrieNode{
    int flag;
    struct TrieNode *next[MAXN];
}TrieNode;

TrieNode mem[500000];
int pn;

TrieNode *CreateTrieNode(){
    TrieNode *p;
    int i;
    p = &mem[pn++];
    p->flag = 0;
    for(i=0; i<MAXN; i++) p->next[i] = NULL;
    return p;
}

int InsertTrie(TrieNode **T, char *s){
    TrieNode *p;

    if(!(p = (*T))) p = (*T) = CreateTrieNode();
    int i=0, k, len;
    len = strlen(s);
    for(i=0; i<len; i++){
        k = s[i] - 'a';

        if(!p->next[k]) {p->next[k] = CreateTrieNode();}

        p = p->next[k];
    }
    p->flag = 1;
    return 1;
}

int SearchTrie(TrieNode *T, char *s){
    TrieNode *p;
    if(!(p = T)) return 0;

    int i, k;
    for(i=0; s[i]; i++){
        k = s[i] - 'a';

        if(!p->next[k]) return 0;

        p = p->next[k];
    }
    if(p->flag) return 1;
    else return 0;
}

char str[120010][20];

int main(){
    TrieNode *T = NULL, *p;
    int n=0, i, j, len;
    while(scanf("%s", str[n]) == 1){InsertTrie(&T, str[n]); n++;}

    for(i=0; i<n; i++){
        len = strlen(str[i]);
        if(len < 2) continue;
        p = T;
        char *s = str[i];
        for(j=0; j<len-1; j++){
            int k = s[j] - 'a';
            p = p->next[k];
            if(p->flag){
                if(SearchTrie(T, s+j+1)){
                    printf("%s\n", str[i]);
                    break;
                }
            }
        }
    }

    return 0;
}
原文地址:https://www.cnblogs.com/tanhehe/p/2919671.html