#10049. 「一本通 2.3 例 1」Phone List(trie树应用)

本文提供了一种解决POJ3630问题的算法,该问题要求判断多组数字串中是否存在两个串,其中一个为另一个的前缀。通过构建树状结构进行高效匹配,实现快速判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POJ3630:
给定 个长度不超过 的数字串,问其中是否存在两个数字串 ,使得 是 的前缀,多组数据.
输入格式
第一行一个整数 ,表示数据组数。

对于每组数据,第一行一个数 ,接下来 行输入 个数字串。

输出格式
对于每组数据,若存在两个数字串 ,,使得 是 的前缀,则输出 NO ,否则输出 YES 。

请注意此处结果与输出的对应关系!

#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
struct node{
    int nxt[13];
    int id;
}tree[maxn];
int cnt;
char s[10005][15];
int n;
int f;
void Insert(char str[15],int id)
{
    int len=strlen(str);
    int p=0;
    for(int i=0;i<len;i++){
        int x=str[i]-'0';
        if(tree[p].nxt[x]==0){
            tree[p].nxt[x]=(++cnt);
        }
        if(tree[p].id!=0&&tree[p].id!=id){
            f=0;
        }
        p=tree[p].nxt[x];
    }
    tree[p].id=id;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        memset(tree,0,sizeof(tree));
        f=1;
        cnt=0;
        for(int i=1;i<=n;i++){
            scanf("%s",s[i]);
            Insert(s[i],i);
        }
        if(f==0){
            printf("NO\n");continue;
        }
        for(int i=1;i<=n;i++){
            Insert(s[i],i);
            if(f==0){
                break;
            }
        }
        if(!f){
            printf("NO\n");
        }
        else{
            printf("YES\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值