字典树过的第一题,感觉得到自己在进步
//#define LOCAL #include <stdio.h> #include <string.h> #define MAXN 20 + 10 char str[MAXN]; const int sonsum = 2; struct Trie { bool terminal; struct Trie* son[2]; }; Trie* newTrie(); bool Insert(Trie *, char *, int); int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); #endif int i; int temp; int cases = 1; Trie* root = new Trie; char ch = '\0'; bool flag; root->terminal = false; for(i = 0; i < sonsum; i++) root->son[i] = NULL; while(~scanf("%s", str)) { // 算法主体 if(~strcmp(str, "9")) { printf("Set %d is immediately decodable\n", cases); root = new Trie; root->terminal = false; for(i = 0; i < sonsum; i++) root->son[i] = NULL; cases++; flag = false; } else { flag = Insert(root, str, strlen(str)); if(flag) { ch = '\0'; while(ch != '9')// 如果插入时经过了终止符||插入的字符串被完全覆盖 ch = getchar(); getchar(); // 除掉回车符 root = new Trie; root->terminal = false; for(i = 0; i < sonsum; i++) root->son[i] = NULL; printf("Set %d is not immediately decodable\n", cases); cases++; flag = false; } } } return 0; } Trie *NewTrie()// Create a new node { Trie *temp = new Trie; temp->terminal = false; for(int i = 0; i < sonsum; i++) temp->son[i] = NULL; return temp; } bool Insert(Trie *pnt,char *s, int len)// insert a new word to Trie tree { bool flag = true; Trie *temp = pnt; for(int i = 0; i < len; i++) { if(temp->terminal) return true; if(temp->son[s[i] - '0'] == NULL) { temp->son[s[i] - '0'] = NewTrie(); flag = false; } temp = temp->son[s[i] - '0']; } temp->terminal = true; return flag; }