hdu 1671 Phone List (字典树)

简介:

题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1671

分析:字典树题目变种,这里的字典树指的是0--9的变化。基本原理没有大的变化就是字典树查找。

 (1)这道题就是找到这组电话号码中是否有 某个电话号码的前n-1个子串是否由其他的电话号码组成。是就输出NO,否就输出YES.题目大意很简单,字典树时的使用就是套模板,做这种题第一次最好自己写一遍模板,以后自己可以直接使用自己的模板。我的字典树模板见 字典树模板

复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXNUM 10
using namespace std;

//定义字典树
typedef struct Trie
{
    bool flag;//从根到此是否为一个单词
    Trie *next[MAXNUM];
}Trie;

Trie *root;

void init()
{
    root = (Trie *)malloc(sizeof(Trie));
    root->flag=false;
    for(int i=0;i<MAXNUM;i++)
    root->next[i]=NULL;
}

void insert(char *word)
{
    Trie *tem = root;
    while(*word!='\0')
    {
        if(tem->next[*word-'0']==NULL)
        {
            Trie *cur = (Trie *)malloc(sizeof(Trie));
            for(int i=0;i<MAXNUM;i++)
            cur->next[i]=NULL;
            cur->flag=false;
            tem->next[*word-'0']=cur;
        }
        tem = tem->next[*word-'0'];
        word++;
    }
    tem->flag=true;
}

bool search(char *word)
{
    Trie *tem = root;
    for(int i=0;word[i]!='\0';i++)
    {
        if(tem==NULL||tem->next[word[i]-'0']==NULL)
        return 0;
        tem=tem->next[word[i]-'0'];
    }
    return tem->flag;
}

void del(Trie *cur)
{
    for(int i=0;i<MAXNUM;i++)
    {
        if(cur->next[i]!=NULL)
        del(cur->next[i]);
    }
    free(cur);
}
int main()
{
    int t,n;
    bool flag;
    char phone_num[10005][20];
    char num[20];
    scanf("%d",&t);
    while(t--)
    {
        init();
        flag = true;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%s",phone_num[i]);
            insert(phone_num[i]);
        }
        for(int i=0;i<n;i++)
        {
            int len = strlen(phone_num[i]);
            memset(num,'\0',sizeof(num));
            for(int j=0;j<len-1;j++)
            {
                num[j]=phone_num[i][j];
                if(search(num))
                {
                    flag = false;
                    break;
                }
            }
        }
        if(flag)printf("YES\n");
        else printf("NO\n");
        del(root);
    }
    return 0;
}
复制代码
本文转自NewPanderKing51CTO博客,原文链接: http://www.cnblogs.com/newpanderking/archive/2012/11/03/2752626.html  ,如需转载请自行联系原作者
相关文章
poj 3630 Phone List
1 #include 2 #include 3 #include 4 #define N 100005 5 using namespace std; 6 int Trie[N][10]; 7 int nodeN; 8 int main() 9 { 10 in...
659 0
hdu 1671 Phone List
点击打开链接hdu 1671 题意:给定n个电话号码串,问这n个电话号码串中是否存在某一串是其它串的前缀,如果存在输出NO,否则YES 思路:把这n个电话号码串建立成字典树,在插入的时候我们直接判断当前插入的字符串是不是其它串的前缀或者其...
745 0
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
859 1
|
4月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
4月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法