poj 2001 Shortest Prefixes 字典树

字典树查询单词

题意给你一些字符串,找出能够唯一标识这个字符串的最短前缀

思路:先把字符串全部存进字典树,依次查找,依次输出,如果该字符出现的次数为1,则停止输出

详情见代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 110000
char str[maxn][40];
int vis[maxn];
int cur=1;
struct node
{
    int num;
    int next[30];
    void init()
    {
        num=0;
        memset(next,-1,sizeof(next));
    }
}trie[maxn];
void insert(char *s,int len)
{
    int p=0;
    for(int i=0; i<len; i++)
    {
        int x=s[i]-'a';
        if(trie[p].next[x]==-1)
        {
            trie[cur].init();
            trie[p].next[x]=cur++;
        }
        p=trie[p].next[x];
        trie[p].num++;
    }
}
int find(char *s,int len)
{
    int p=0;
    for(int i=0; i<len; i++)
    {
        printf("%c",s[i]);
        int x=s[i]-'a';
        p=trie[p].next[x];
        if(trie[p].num==1)break;//判断该字符只出现过一次
    }
}
int main()
{
    int n=0;
    trie[0].init();
    while(scanf("%s",str[n])!=EOF)
    {
        int len=strlen(str[n]);
        vis[n]=len;
        insert(str[n],len);
        n++;
    }
    for(int i=0; i<n; i++)
    {
        printf("%s ",str[i]);
        find(str[i],vis[i]);
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值