样例 POJ 1056 http://poj.org/problem?id=1056
字典树入门,很容易的一道字典树题;
题意: 输入一些字符串,由0 1 组成,如果有一个字符串是另一个的前缀,就是不能被立即解开的锁,输出
Set 1 is not immediately decodable,如果没有前缀,就是能被立即解开的,输入一个 9 代表 这组输入结束, 每组结束后,需要对字典树清空,就是删除字典树, 判断前缀的方法,每输入一个字符串,就在该字符串的树的结尾标记,如果下个字符串经过了这个标记,就说明是前缀; 字典树的 root 需要动态分配内存,new 动态分配内存, delete 删除动态内存, 所以代码应该这样 */<pre name="code" class="cpp">// poj 1056 IMMEDIATE DECODABILITY #include <iostream> #include <cstdio> #include <string.h> using namespace std; typedef struct TREE { TREE *next[2]; int end; // 结尾 TREE() //结构体的初始化,应该这样 { end=0; memset(next,0,sizeof(next)); } }tree; TREE *root; //这里需定义为指针 char code[15]; int flag = 1; void creat(char *code) { TREE *x = root; for(int i=0; code[i] != ' '; i++) { int a = code[i] - '0'; if(x->next[a] == NULL) x->next[a] = new TREE(); x = x->next[a]; if(x->end == 1) flag = 0; } x->end = 1; } void del(TREE *root) { for(int i=0;i<2;i++) { if(root->next[i] != NULL) del(root->next[i]); } delete root; //删除的也只是动态内存而已 } int main() { freopen("1.in","r",stdin); int i = 1; root = new TREE(); // 动态分配内存 while(gets(code) != NULL) { if(code[0] != '9') creat(code); if(code[0] == '9') { if(flag) printf("Set %d is immediately decodable ", i++); else printf("Set %d is not immediately decodable ", i++); del(root); root = new TREE(); //再次分配动态内存 flag = 1; } } return 0; }