hdu 1671
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1671
题意:给堆电话号码(数字,长度不大于10),如果有一个号码是另一个号码的前缀就NO,否则YES。
mark:trie树来存和查找号码,但是写的有点恶心。
代码:
# include <stdio.h> # include <string.h> typedef struct TRIE{ int end ; int next[10] ; } TRIE ; TRIE trie[100010] ; int cnt ; char tb(char ch){return ch-'0';} int add(char s[], int p) { int i, rtn = 0 ; for (i = 0 ; s[i] ; i++) { if (trie[p].next[tb(s[i])] == 0) { trie[p].next[tb(s[i])] = cnt++ ; rtn = 1 ; } p = trie[p].next[tb(s[i])] ; if (trie[p].end == 1) return 0 ; } trie[p].end = 1 ; return rtn ; } int main () { int T, flag, ans,n ; char num[15] ; scanf ("%d", &T) ; while (T--) { scanf ("%d", &n) ; memset (trie, 0, sizeof(trie)) ; cnt = 2 ; ans = 1 ; while (n--) { scanf ("%s", num) ; flag = add (num, 1) ; // printf ("%s, %d\n", num, flag) ; if (flag == 0) ans = 0 ; } puts (ans ? "YES" : "NO") ; } return 0 ; }