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 ;
}
posted @ 2012-04-11 02:15  Seraph2012  阅读(350)  评论(0编辑  收藏  举报