hdu1671 字典树

比较简单,出现前缀。不过要释放空间。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct trie
{
    trie *next[10];
    int sum;
};
trie *root;
char str[10002][11];
void init()
{
    root=(trie*)malloc(sizeof(trie));
    for(int i=0;i<10;i++)
        root->next[i]=NULL;
    root->sum=0;
}
void insert(char *s)
{
    int i,j,len=strlen(s);
    trie *p=root,*q;
    for(i=0;i<len;i++)
    {
        int id=s[i]-'0';
        if(p->next[id]==NULL)
        {
            q=(trie*)malloc(sizeof(trie));
            for(j=0;j<10;j++)
                q->next[j]=NULL;
            q->sum=0;
            p->next[id]=q;
        }
        p=p->next[id];
        p->sum++;
    }
}
int query(char *s)
{
    int i,j,len=strlen(s);
    trie *p=root;
    for(i=0;i<len;i++)
    {
        int id=s[i]-'0';
        p=p->next[id];
    }
    if(p->sum>1)
        return 1;
    return 0;
}
void freetrie(trie *rt)
{
    for(int i=0;i<10;i++)
        if(rt->next[i]!=NULL)
            freetrie(rt->next[i]);
        free(rt);
}
int main()
{
    int flag,i,j,t,n;
    scanf("%d",&t);
    while(t--)
    {
        init();
        flag=0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%s",str[i]);
            insert(str[i]);
        }
        for(i=0;i<n;i++)
        {
            flag=query(str[i]);
            if(flag)break;
        }
        if(flag)
            printf("NO\n");
        else printf("YES\n");
        freetrie(root);//释放内存
    }
}

 

posted @ 2015-07-30 13:40  sweat123  阅读(375)  评论(0编辑  收藏  举报