• hdu 1671 Phone List


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define ZERO 0
    const int  FIRST_CHAR = '0';
    char  num[11111][20] ;
    typedef struct node
    {
        struct node *child[20]; /* 存储下一个字符 */
        int n; /* 记录当前单词出现的次数 */
    }node, *Node;
    
    Node root; /* 字典树的根结点(不存储不论什么字符) */
    /* 插入单词 */
    void insert(char *str)
    {
        int i, index, len;
        Node current = NULL, newnode = NULL;
        
        len = strlen(str);
        
        current = root; /* 開始时当前的结点为根结点 */
        for (i = 0; i < len; i++) /* 逐个字符插入 */
        {
            index = str[i] - FIRST_CHAR; /* 获取此字符的下标 */
            if (current->child[index] != NULL) /* 字符已在字典树中 */
            {
                current = current->child[index]; /* 改动当前的结点位置 */
                (current->n)++; /* 当前单词又出现一次, 累加 */
            }
            else /* 此字符还没出现过, 则新增结点 */
            {
                newnode = (Node)calloc(1, sizeof(node)); /* 新增一结点, 并初始化 */
                current->child[index] = newnode;
                current = newnode; /* 改动当前的结点的位置 */
                current->n = 1; /* 此新单词出现一次 */
            }
        }
    }
    /* 在字典树中查找单词 */
    int find_word(char *str)
    {
        int i, index, len;
        Node current = NULL;
        
        len = strlen(str);
        
        current = root; /* 查找从根结点開始 */
        for (i = 0; i < len; i++)
        {
            index = str[i] - FIRST_CHAR; /* 获取此字符的下标 */
            if (current->child[index] != NULL) /* 当前字符存在字典树中 */
            {
                current = current->child[index]; /* 改动当前结点的位置 */
            }
            else
            {
                return ZERO; /*还没比較完就出现不匹配, 字典树中没有此单词*/
            }
        }
        
        if((current->n)>1) return  1;
        return 0;   
    }
    void release(Node root)
    {
         int i;
         
          if (NULL == root)
        {
            return;
        }
        
        for (i = 0; i < 20; i++)
        {
            if ( root->child[i] != NULL )
            {
                release( root->child[i] );
            }
        }
        
        free( root );
        root = NULL;
    }
    
    int main()
    {
        int i,n,m,check;
        
       
         scanf("%d",&n);
        while(n--)
        {
            scanf("%d",&m);
             root = (Node)calloc(1, sizeof(node));//错了N次
            for(i=0;i<m;i++)
            {
              scanf("%s",num[i]);
              insert(num[i]);
            }
            check=0;
           for(i=0;i<m;i++)
            {
               if(find_word(num[i])) 
                {
                  check=1;
                  break;
                }
            }
            if(check==1) 
              printf("NO
    ");
            if(check==0)
              printf("YES
    ");
            release(root);
        }
        return 0;
    }
    

  • 相关阅读:
    64_l2
    64_l1
    64_k2
    64_k1
    64_j2
    64_j1
    64_g6
    64_g5
    64_g4
    64_g3
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7098057.html
Copyright © 2020-2023  润新知