POJ 3630 Phone List

本文介绍了一种使用Trie树实现电话号码簿的方法,通过数组而非面向对象的方式优化了性能,避免了时间限制错误。文章详细展示了插入操作的过程,并提供了一个完整的C++代码示例。

/*
Trie树,一开始用的class, new, delete等面向对象的东西,结果TLE
后来改用数组实现就OK了
这题只需要insert操作,无需search操作,边插入边判断就OK了
*/

#include <iostream>
#define MAX_N 120000
using namespace std;

int trieTree[MAX_N + 1][12]; //第10位是ID,第11位是count
int countv = 0;

bool insert(char phone[], int id)
{
    int curNode = 0, i, next;
    char c;
    for(i = 0; i < strlen(phone); i++)
    {
        c = phone[i];
        trieTree[curNode][11]++;
        next = trieTree[curNode][c - '0'];
        if(next == 0)
            trieTree[curNode][c- '0'] = next = ++countv;
        curNode = next;
        if(trieTree[curNode][10] != 0)
            return false;
    }
    if(trieTree[curNode][11] > 0)
        return false;
    trieTree[curNode][10] = id;
    return true;
}
int main()
{   
    int caseNum, c, i, pNum;
    char temp[10];
    scanf("%d", &caseNum);
    for(c = 0; c < caseNum; c++)
    {
        memset(trieTree, 0, sizeof(trieTree));
        countv = 0;
        scanf("%d", &pNum);
        bool can = true;
        for(i = 0; i < pNum; i++)
        {
            scanf("%s", temp);
            if(can)
                if(!insert(temp, i + 1))
                    can = false;
        }
        if(can)
            printf("YES/n");
        else
            printf("NO/n");
       
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值