HDU 1075

题意很简单 给你一个火星人的语言和地球人语言单词对照表,翻译火星人的语言。

虽然提前知道这题是字典树,但是看了一下题目,还是觉得如果不知情的话也会想去考虑自点数,因为太明显了。。给一个其他语言的单词和已知语言的单词对照表,完全就是字符匹配。。。

 

很简单,先把火星语插入的字典树,同时设置一个 flag 数组,必须保证整个单词都出现过才能 return rt,之后就是开一个下表数组,来记录这个单词出现的位置,然后在主语句中翻译时,如果不是空格就去对这串字符进行字典树搜索,没有发现对应的就输出源语句,否则输出对应位置的翻译语句。‘

 

 

 

做了几天的网络流。。稍微做到字典树版子题放松下。。。。

 

 

 

以下是 AC 代码

 

 

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e7+5;
int tree[maxn][30];
int flag[maxn];
int pos[maxn];
int tot;
int insert_(char *s)
{
    int len = strlen(s);
    int rt = 0;
    for(int i=0;i<len;i++)
    {
        int id = s[i] - 'a';
        if(!tree[rt][id])
            tree[rt][id] = ++tot;
        rt = tree[rt][id];
    }
    flag[rt] = true;
    return rt;
}
int find_(char *s)
{
    int len = strlen(s);
    int rt = 0;
    for(int i=0;i<len;i++)
    {
        int id = s[i] - 'a';
        if(!tree[rt][id])
            return -1;
        rt = tree[rt][id];
    }
    if(flag[rt])
        return rt;
    else
        return -1;
}
char ss[maxn][20];
char tmp[maxn];
int main()
{
    int cnt = 0;
    scanf("%s",tmp);
    while(~scanf("%s",ss[cnt]))
    {
        if(ss[cnt][0] == 'E')
        {
            scanf("%s",tmp);
            break;
        }
        scanf("%s",tmp);
        pos[insert_(tmp)] = cnt;
        cnt++;
    }
    getchar();
    while(gets(tmp))
    {
        if(tmp[0]=='E') break;
        int len=strlen(tmp);
        char str[12];
        int cnt;
        for(int i=0;i<len;i++)
        {
            if(tmp[i]>='a'&&tmp[i]<='z'&&i<len)
            {
                cnt=0;
                while(tmp[i]>='a'&&tmp[i]<='z')
                {
                    str[cnt++] = tmp[i++];
                }
                str[cnt]='\0';
                int pp=find_(str);
                if(pp!=-1)
                    printf("%s",ss[pos[find_(str)]]);
                else
                    printf("%s",str);
                printf("%c",tmp[i]);
            }
            else
                printf("%c",tmp[i]);
        }
        printf("\n");
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值