hdu 1075 What Are You Talking About trie字典树

本文详细解析了HDU 1075题目的算法实现,通过构建字典树来解决外星文翻译问题。包括输入外星文词典、翻译待翻译的句子,以及如何处理非字母字符。

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

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1075

大意:有外星人来了,但是我不懂外星文。然后我有一本字典,然我去翻译,字典由start开始有end结束的相当于map转换,然后是由由start开始有end结束的需要翻译的句子。

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct node
{
    int flag;
    char ans[55];
    struct node *next[27];
}tree;
tree *new_node()
{
    tree *p;
    p = (tree*)malloc(sizeof(tree));

    int i;
    for(i = 0;i < 26;i++)
    p->next[i] = NULL;

    p->flag = 0;
    return p;
}
void insert(tree *rt,char s[],char ans[])
{
    tree *p;
    p = rt;
    int i;
    for(i = 0;s[i] != '\0';i++)
    {
        int t;
        t = s[i]-'a';
        if(p->next[t] == NULL)
        p->next[t] = new_node();

        p = p->next[t];
    }
    strcpy(p->ans,ans);
    p->flag = 1;
    return;
}
int search(tree *rt,char s[])
{
    tree *p;
    p = rt;
    int i;
    for(i = 0;s[i] != '\0';i++)
    {
        int t;
        t = s[i]-'a';
        if(p->next[t] == NULL)
        return 0;
        p = p->next[t];
    }
    if(p->flag)
    {
        printf("%s",p->ans);
        return 1;
    }
    else
    return 0;
}
int main()
{
   
    char s1[3005],s2[3000],word[3000];
    int n,m,i,j,leap;
    tree *rt;
    scanf("%s",s1);
    rt = new_node();
    while(~scanf("%s",s1))
    {
        if(strcmp(s1,"END") == 0)
        break;
        scanf("%s",s2);
        insert(rt,s2,s1);
    }
    scanf("%s",s1);
    getchar();
    while(gets(s2) != NULL)
    {
        if(strcmp(s2,"END") == 0)
        break;
        int count = 0,i;
        int len = strlen(s2);
        for(i = 0;i <= len;i++)//不能是< len,因为当输入sdad最后没有空格的时候他不会翻译。
        {
            if(isalpha(s2[i]))
            word[count++] = s2[i];
            else
            {
                word[count] = '\0';
                if(count)
                {
                    leap = search(rt,word);
                    if(!leap)
                        printf("%s",word);
                }
                if(i != len)//这里别忘了判断~
                printf("%c",s2[i]);

                count = 0;
            }
        }
        puts("");
    }
    return 0;
}

转载于:https://www.cnblogs.com/0803yijia/archive/2012/08/13/2636980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值