poj_2001 Shortest Prefixes(Trie树应用)

【题目】

点击这里

【思路】

Trie树基本应用,先建树,而后对每个字符串查询,在查询过程中,取第一次碰到的尾缀单词数为1的结点之前的字符串作为前缀,如果查询完都没有,则取本身为前缀。

【代码】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node
{
    char ch;
    int num;
    struct node *fChild, *rCousin;
}* triNode;

triNode newTree(char t)
{
    triNode x=(triNode) malloc(sizeof(struct node));
    x->ch=t; x->num=1; x->fChild=NULL; x->rCousin=NULL;
    return x;
}

void addTree(triNode x, const char *s, int p)
{
    int sLen=strlen(s),i;
    for (i=p;i<sLen;i++)
    {
        x->fChild=newTree(s[i]);
        x=x->fChild;
    }
}

int main()
{
    triNode t=newTree('0');
    int total=0,i,j;
    char s[21],a[1001][21];
    while (scanf("%s",s)!=EOF)
    {
        strcpy(a[total++],s);
        int sLen=strlen(s);
        triNode x=t,y;
        for (i=0;i<sLen;i++)
        {
            y=x->fChild;
            if (y==NULL) {addTree(x,s,i);break;}
            do
            {
                if (y->ch==s[i]){x=y;x->num++;break;}
                x=y; y=y->rCousin;
            }while (y!=NULL);
            if (y==NULL) {x->rCousin=newTree(s[i]); addTree(x->rCousin,s,i+1); break;}
        }
    }
    for (i=0;i<total;i++)
    {
        printf("%s ",a[i]);
        triNode x=t;
        int sLen=strlen(a[i]);
        for (j=0;j<sLen;j++)
        {
            x=x->fChild;
            while (1){if (x->ch==a[i][j]) break; else x=x->rCousin;}
            printf("%c",x->ch);
            if (x->num==1) {printf("\n");break;}
            if (j==sLen-1) printf("\n");
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

薄帷清风

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值