HDU1305Immediate Decodability(字典树)

题目链接

解题报告:

现在假定两个字符串A,B。 A的长度小于B。分两种情况,

当B先输入时(即长的先输入),途经的结点的flag如果为1,即如果有小于B的单词,便为前缀。

当A先输入时(即短的先输入),当建立到A的最后一个字符时, 如果该结点已存在,那么证明,已有一个以该字符为前缀的字符已经输入。

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

#define MAXN 2

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

TrieNode *CreateTrieNode(){
    TrieNode *p;
    int i;
    p = (TrieNode *)malloc(sizeof(TrieNode));
    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] - '0';
        if(i == len-1 && p->next[k]) return 0;
        if(!p->next[k]) {p->next[k] = CreateTrieNode();}

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

void ReleaseTrie(TrieNode *T){
    int i;
    for(i=0; i<MAXN; i++){
        if(T->next[i]) ReleaseTrie(T->next[i]);
        T->next[i] = NULL;
    }
    free(T);
}

int main(){
    TrieNode *T = NULL;
    int flag = 1, cnt=1;
    char s[20];
    while(gets(s)){
        if(strcmp(s, "9") == 0){
            if(flag) printf("Set %d is immediately decodable\n", cnt);
            else printf("Set %d is not immediately decodable\n", cnt);

            ReleaseTrie(T);
            T = NULL;
            flag = 1;
            cnt++;
            continue;
        }
        if(flag){
            if(!InsertTrie(&T, s)) flag = 0;
        }
    }

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