// [7/5/2014 Sjm] /* 字典树,找前缀。具体求解思路同:字典树 之 hdu 1671 poj 3630 */#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; const int MAX = 2; struct Trie{ bool Judge; Trie* next[2]; Trie(){ Judge = false; memset(next, NULL, sizeof(next)); } }; Trie* Root; bool Cre_Sea_Trie(char* str){ int Jdg1 = true, Jdg2 = false; int len = strlen(str); Trie* p = Root; for (int i = 0; i < len; i++) { int pos = str[i] - '0'; if (!(p->next[pos])) { p->next[pos] = new Trie; Jdg1 = false; } else { if (p->next[pos]->Judge) { Jdg2 = true; break; } } p = p->next[pos]; } p->Judge = true; return (Jdg1 || Jdg2); } void DelTrie(Trie* T) { for (int i = 0; i < MAX; i++) { if (T->next[i]) { DelTrie(T->next[i]); } } delete[] T; } int main() { //freopen("input.txt", "r", stdin); char str[10][15]; int num = 0, mycount = 0; while (~scanf("%s", str[num])) { if (strcmp(str[num], "9") == 0) { Root = new Trie; mycount++; int i; for (i = 0; i < num; i++) { if (Cre_Sea_Trie(str[i])) { printf("Set %d is not immediately decodable ", mycount); break; } } if (i == num) { printf("Set %d is immediately decodable ", mycount); } DelTrie(Root); num = 0; continue; } num++; } return 0; }