判断编码是否合法。合法的编码不允许出现一个编码是另一个编码的前缀。问题就在判断
是否出现这样的情况。用字典树存储,定义两个标记,end为0代表当前结点是一个编码的结束,
alr为1代表有一个编码经过了这个结点。由字典树的性质,当一个编码结束的结点alr为1,那么
代表这个编码是另一个编码的前缀。此外,当一个编码经过的某个结点出现end值为1的情况,说
明有一个编码是当前编码的前缀。
/*Accepted 168K 0MS C++ 1044B 2012-08-02 13:05:53*/ #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ int next[2]; int end, alr; }Trie; Trie t[1 << 8]; int tp; int insert(char *x, int site) { if(t[site].end) return 1; if(*x) { t[site].alr = 1; if(!t[site].next[*x - '0']) t[site].next[*x - '0'] = tp ++; insert(x + 1, t[site].next[*x - '0']); } else { t[site].end = 1; return t[site].alr; } } int main() { int T, n, flag = 0; char s[15]; tp = 1; T = 0; while(scanf("%s", s)!= EOF) { if('9' == s[0]) { if(!flag) printf("Set %d is immediately decodable\n", ++ T); else printf("Set %d is not immediately decodable\n", ++ T); flag = 0; memset(t, 0, sizeof (Trie) * (tp + 1)); tp = 1; continue; } if(!flag && insert(s, 0)) flag = 1; } return 0; }