题目链接。
解题报告:
现在假定两个字符串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; }