• HDU1671_Phone List


    题目大意:

                   输入多串数字串,要求判断是否有的数字串是其它串的前缀。如果存在输出NO,否则输出YES。

    解题思路:

                   用trie建立字典树,然后在每个数字串的结尾处标志1,之后每输入一个串,就判断一下。是否有之前的标志记号。

    代码:

    #include<iostream>
    using namespace std;
    
    const int MAX_LEN = 11;
    typedef struct trie
    {
        trie *next[10];
        int num;
    } T;
    
    T *tree;
    bool flag;
    
    void trieDel(T *p)
    {
        for(int i = 0; i < 10; i++)
        {
            if(p->next[i] != NULL)
                trieDel(p->next[i]);
        }
        free(p);
    }
    
    void trieInsert(char str[])
    {
        T *p = tree, *q;
        int len = strlen(str);
        for(int i = 0; i < len; i++)
        {
            int id = str[i] - '0';
            if(p->next[id] == NULL)
            {
                q = new T;
                for(int j = 0; j < 10; j++)
                    q->next[j] = NULL;
    
                q->num = 0;
                p->next[id] = q;
                p = p->next[id];
            }
            else
                p = p->next[id];
    
            if(p->num == 1)
                flag = false;
        }
        p->num = 1;
    
        for(int i = 0; i < 10; i++)
        {
            if(p->next[i] != NULL)
            {
                flag = false;
                break;
            }
        }
    }
    
    void init()
    {
        tree = new T;
        for(int i = 0; i < 10; i++)
        {
            tree->next[i] = NULL;
        }
    }
    
    int main(void)
    {
        int cas;
        scanf("%d", &cas);
        while(cas--)
        {
            flag = true;
            int n;
            scanf("%d", &n);
            getchar();
            init();
            for(int i = 0; i < n; i++)
            {
                char str[MAX_LEN];
                gets(str);
                if(!flag)
                    continue;
                trieInsert(str);
            }
            trieDel(tree);
            if(flag)
                printf("YES\n");
            else
                printf("NO\n");
        }
        return 0;
    }
    

      

      

  • 相关阅读:
    vue学习目录
    充分利用 SQL Server Reporting Services 图表
    MSCRM 用户登录日志
    Microsoft Dynamics CRM MVP
    在SSRS 里实现 SUMIF
    MSCRM 报表显示 rsprocessingaborted 错误
    电商CRM的痛点在哪里?
    MSCRM 2011/2013/2015 修改显示记录数
    MSCRM 2013/2015 Ribbon Editor
    Q:解决每天第一次打开MSCRM系统展示慢的问题
  • 原文地址:https://www.cnblogs.com/cchun/p/2520590.html
Copyright © 2020-2023  润新知