HDU - 1671 Phone List(字典树)

点我看题

题意:在给出的所有电话号码中,判断是否有一个电话号码以另一个电话号码为前缀,有的话输出YES,否则输出NO.

分析:在把电话号码插入到字典树的过程中,判断当前电话是否有以前面的电话为前缀或者当前电话作为前面出现字母的前缀.我之前写的时候忽略了以当前字母为前缀的情况,结果wa了两发...

参考代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>

using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn = 1e4+5;
int n;
char tel[15];
//TrieTree
int child[1000000][10];
bool exist[1000000];
int node;
int flag;

void init()
{
    mem(child[0],0);
    node = 1;
    mem(exist,false);
}

void TrieInsert( char tel[])
{
    int rt = 0;
    int p = 0;
    while( tel[p] != '\0')
    {
        int id = tel[p]-'0';
        if( (tel[p+1] == '\0' && child[rt][id]) || exist[rt])//两种判断
        {
            flag = 1;
            return;
        }
        if( !child[rt][id])
        {
            mem(child[node],0);
            child[rt][id] = node++;
        }
        rt = child[rt][id];
        p++;
    }
    exist[rt] = true;
}

int main()
{
    int T;
    scanf("%d",&T);
    while( T--)
    {
        init();
        scanf("%d",&n);
        flag = 0;
        for( int i = 1; i <= n; i++)
        {
            scanf("%s",tel);
            if( !flag)
                TrieInsert(tel);
        }
        if( flag)
            puts("NO");
        else
            puts("YES");
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值