POJ3630 Phone List

题意给N个电话号码,检测是否存在一个电话号码是另外一个电话号码的前缀,存在输出NO否则输出YES。

trie树的模板题,正好拿来试试模板。只要在每次insert的时候检测一下经过的路径存不存在单词节点就行。另外在插入完成时也要判断一下当前的单词节点在不在其他单词的路径上。

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <string>
#include <cstring>
using namespace std;
const int tk=11,tb='0';
int top,tree[200000][tk+1];
void init()
{
    top=1;
    memset(tree,0,sizeof tree);
}
int search(char *s)
{
    for (int rt=0; rt=tree[rt][*s-tb];)
    {
        if (*(++s)==0) return tree[rt][tk];
    }
    return 0;
}
bool insert(char *s,int rank=1)
{
    int rt,nxt;
    for (rt=0; *s; rt=nxt,++s)
    {
        nxt=tree[rt][*s-tb];
        if (tree[rt][tk]) return false;
        if (0==nxt)
        {
            tree[rt][*s-tb]=nxt=top;
            memset(tree[top],0,sizeof tree[top]);
            top++;
        }
    }
    tree[rt][tk]=rank;
    for (int i=0; i<=9; i++)
    if (tree[rt][i]!=0) return false;
    return true;
}
void del(char* s)
{
    int rt=0;
    for ( ; *s; ++s)
    rt=tree[rt][*s-tb];
    tree[rt][tk]=0;
}
int prefix (char *s)
{
    int rt=0,lv;
    for (lv=0; *s; ++s,++lv)
    {
        rt=tree[rt][*s-tb];
        if (rt==0) break;
    }
    return lv;
}
int tt;
int n;
int main()
{
    //freopen("a.in","r",stdin);
    scanf("%d",&tt);
    char str[20];
    while (tt--)
    {
        bool flag=true;
        init();
        scanf("%d",&n);
        for (int i=1; i<=n; i++)
        {
            scanf("%s",str);
           //if (!flag) continue;
            if (!insert(str))
            {
                flag=false;
            }
        }
        if (flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值