HDU-1075-字典树模板

题目传送门
伊格那丢很幸运,昨天他遇见了一个火星人。但是他不懂火星人使用的语言。火星人给了他一本关于火星的历史书和一本字典。现在伊格内修斯想把这本历史书译成英语。你能帮助他吗?

输入

问题只有一个测试用例,测试用例由两个部分组成,字典部分和书籍部分。字典部分从一行开始包含一个字符串“START”,这个字符串应该被忽略,然后是一些行,每一行包含两个字符串,第一个是英语单词,第二个是火星语中对应的单词。带有单个字符串“END”的行表示目录部分的结束,应该忽略该字符串。书的部分以一行开始包含一个字符串“START”,这个字符串应该忽略,然后用火星语写一篇文章。你应该用词典把这篇文章译成英语。如果你在字典里找到了这个词,你应该翻译它,把新单词写进你的译文,如果你不能在字典里找到这个词,你不需要翻译它,只是复制旧单词到你的翻译。空格(’ ‘),制表符(’\t’),输入(’\n’)和所有标点符号不应翻译。带有单个字符串“END”的行表示图书部分的结束,这也是输入的结束。所有单词都是小写的,每个单词最多包含10个字符,每行最多包含3000个字符。

输出

在这个问题中,你必须输出历史书的译文。

Sample Input

START
from fiwo
hello difh
mars riwosf
earth fnnvk
like fiiwj
END
START
difh, i’m fiwo riwosf.
i fiiwj fnnvk!
END

Sample Output

hello, i’m from mars.
i like earth!

Hint

Huge input, scanf is recommended.
将火星语放在字典数里存起来。。 seek的时候直接返回该火星语对应的 地球语id
注意先scanf输入然后在gets时 需要getchar()一下啊啊啊啊啊啊啊啊啊啊啊啊啊

#include <cstring>
#include <cstdio>
#define m(a,b) memset(a,b,sizeof a)
using namespace std;
const int N=100;
struct trie
{
    int id;
    trie *nex[26];
    trie()
    {
        id=-1;
        m(nex,0);
    }
};
trie *root;
void create(char *str,int num)
{
    int len=strlen(str);
    trie *a=root;
    for(int i=0;i<len;i++)
    {
        int k=str[i]-'a';
        if(a->nex[k]==NULL)
            a->nex[k]=new trie();
        a=a->nex[k];
    }
    a->id=num;
}
int seek(char *str,int p1,int p2)
{
    trie *a=root;
    for(int i=p1;i<=p2;i++)
    {
        int k=str[i]-'a';
        a=a->nex[k];
        if(a==NULL)
            return -1;
    }
    return a->id;
}
void del(trie *a)
{
    for(int i=0;i<26;i++)
        if(a->nex[i])
            del(a->nex[i]);
    delete(a);
}
char s1[500010][15],s2[500010];
int main()
{
    scanf("%s",s2);
    int tot=0;
    root=new trie();
    while(~scanf("%s",s1[++tot]),strcmp(s1[tot],"END"))
    {
        scanf("%s",s2);
        create(s2,tot);
    }
    scanf("%s",s1);
    int index=-1;
    getchar();     //!!!!!!!!!!!!!
    while(gets(s2),strcmp(s2,"END"))
    {
        int len=strlen(s2);
        for(int i=0;i<len;i++)
        {
            if(!islower(s2[i]))
                printf("%c",s2[i]);
            else
            {
                if(index==-1)
                    index=i;
                if(!islower(s2[i+1]))
                {
                    int num=seek(s2,index,i);
                    if(num==-1)
                    {
                        for(int j=index;j<=i;j++)
                            printf("%c",s2[j]);
                    }
                    else
                        printf("%s",s1[num]);
                    index=-1;
                }
            }
        }
        printf("\n");
    }
    del(root);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值