hdu1671Phone List - 字典树

来源:岁月联盟 编辑:exp 时间:2012-07-28
hdu1671Phone List
简单的字典树
空间换时间,花销超大,,,如果有多组数据的话 呃
那用完就释放吧 , 恩 。
[cpp] 
#include<iostream> 
using namespace std; 
 
struct trie 

    bool exist; 
    int num; 
    trie *next[10]; 
    trie() 
    { 
        exist=0; 
        num=0; 
        for(int i=0;i<10;i++) next[i]=0; 
    } 
} *root; 
 
bool insert(trie *p,char *s) 

    int k=0; 
    while(s[k]!='/0') 
    { 
        if(!p->next[s[k]-'0']) p->next[s[k]-'0']=new trie; 
        p=p->next[s[k++]-'0']; 
         
        if(p->exist) return 0;            //如果此前缀为电话号码,,输出"NO" 
        p->num++; 
    } 
    p->exist=1; 
    if(p->num>1)  return 0;               //之前有号码路过的说,, 
     
    return 1; 

 
void Free(trie *p) 

    for(int i=0;i<10;i++) 
        if(p->next[i]) Free(p->next[i]); 
    if(p)  delete p; 

 
int main() 

    int T,n,i; 
    bool Success; 
    char t[11]; 
    scanf("%d",&T); 
    while(T--) 
    { 
        root=new trie; 
        Success=1; 
        scanf("%d",&n); 
        for(i=1;i<=n;i++) 
        { 
            scanf("%s",t); 
            if(!insert(root,t)) {Success=0; i++;break;} 
        } 
        for(;i<=n;i++) scanf("%s",t); 
        printf(Success?"YES/n":"NO/n"); 
        Free(root); 
    } 
    return 0;