poj3630

trie

View Code
#include  < iostream >
#include 
< cstdio >
#include 
< cstdlib >
#include 
< cstring >
using   namespace  std;

#define  maxl 15
#define  maxn 10005

struct  Node
{
    Node 
* next[ 10 ];
    
bool  have;
    
bool  end;
} trie[maxn 
*  maxl];

int  n;
char  st[maxl];
int  ncount;

bool  ins(Node  * proot,  char   * st)
{
    
if  (proot -> end)
        
return   false ;
    
if  (st[ 0 ==   ' \0 ' )
    {
        proot
-> end  =   true ;
        
return   ! proot -> have;
    }
    
if  ( ! proot -> next[st[ 0 -   ' 0 ' ])
    {
        proot
-> next[st[ 0 -   ' 0 ' =  trie  +  ncount;
        ncount
++ ;
        proot
-> have  =   true ;
        ins(proot
-> next[st[ 0 -   ' 0 ' ], st  +   1 );
        
return   true ;
    }
    
return  ins(proot -> next[st[ 0 -   ' 0 ' ], st  +   1 );
}

void  finish( int  a)
{
    
int  b  =  n  -  a  -   1 ;
    
for  ( int  i  =   0 ; i  <  b; i ++ )
        scanf(
" %s " , st);
}

bool  work()
{
    ncount 
=   1 ;
    memset(trie, 
0 sizeof (trie));
    
for  ( int  i  =   0 ; i  <  n; i ++ )
    {
        scanf(
" %s " , st);
        
if  ( ! ins(trie, st))
        {
            finish(i);
            
return   false ;
        }
    }
    
return   true ;
}

int  main()
{
    
// freopen("t.txt", "r", stdin);
     int  t;
    scanf(
" %d " & t);
    
while  (t -- )
    {
        scanf(
" %d " & n);
        
if  (work())
            printf(
" YES\n " );
        
else
            printf(
" NO\n " );
    }
    
return   0 ;
}

你可能感兴趣的:(poj)