http://acm.hdu.edu.cn/showproblem.php?pid=1671

依旧是Trie树,和上一题差不太多

View Code
#include <stdio.h>
#include <string.h> 
#include <stdlib.h> 
const int MAX=10; 
typedef struct Trie
{
    Trie *next[MAX];
    int v;
};
Trie *root;
void create(char *str)
{
    int len=strlen(str);
    Trie *p=root,*q;
    for(int i=0;i<len;i++)
    {
        int id=str[i]-'0';
        if(p->next[id]==NULL)
        { 
            q=(Trie*)malloc(sizeof(Trie));
            q->v=1;
            for(int j=0;j<MAX;j++)
                q->next[j]=NULL;
            p->next[id]=q;
            p=p->next[id]; 
        }
        else
        {
            p->next[id]->v++;
            p=p->next[id];
        } 
    }
    p->v=-1; 
} 
int find(char *str)
{ 
    int len=strlen(str);
    Trie *p=root; 
    for(int i=0;i<len;i++)
    {
        int id=str[i]-'0';
        p=p->next[id];
        if(p==NULL)return 0;
        if(p->v==-1)return -1; 
    }
    return -1;
} 
int del(Trie*T)
{
    if(T==NULL)return 0;
    for(int i=0;i<MAX;i++)
        if(T->next[i]!=NULL)
            del(T->next[i]);
    free(T); 
    return 0;
} 
int main()
{
    char str[20];
    int t,n,i;
    scanf("%d",&t);
    while(t--)
    { 
        int flag=0; 
        root=(Trie*)malloc(sizeof(Trie)); 
        for(i=0;i<MAX;i++)
            root->next[i]=NULL;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%s",str);
            if(flag)continue;
            if(find(str)==-1)flag=1;
            create(str);
        } 
        if(flag)puts("NO");
        else puts("YES"); 
        del(root); 
    } 
    return 0;
}