HDU1075 What Are You Talking About Tire树

题目大意:给你一篇火星文,让你按给定的词典翻译成英文并输出翻译后的文章,对于词典中没有的火星文,直接原样输出即可。


分析:Tire树的应用,在插入数据的时候顺便把火星文对应的英文单词记录即可,这样在查询的时候,如果查询成功,那么就输出其对应的英文,否则原样输出。


实现代码如下:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
#define son_num 30
struct tire
{
    char dic[15];
    bool terminal;
    struct tire *next[son_num];
};
tire *root;

tire *init()
{
    tire *p=(tire *)malloc(sizeof(tire));
    for(int i=0;i<son_num;i++)
      p->next[i]=NULL;
    p->terminal=false;
    return p;
}

void insert(char earth[],char mars[])
{
    int len=strlen(mars);
    tire *p=root; //tire *p; p=root;
    for(int i=0;i<len;i++)
    {
        if(!p->next[ mars[i]-'a' ])
          p->next[ mars[i]-'a' ]=init();
        p=p->next[ mars[i]-'a' ];
    }
    p->terminal=true;
    strcpy(p->dic,earth);
}

void find(char earth[])
{
    int len=strlen(earth);
    tire *p=root; //tire *p; p=root;
    int i=0;
    while(earth[i]!='\0'&&p->next[ earth[i]-'a' ])
    {
        p=p->next[ earth[i]-'a' ];
        i++;
    }
    if(p->terminal&&earth[i]=='\0') printf("%s",p->dic);
    else printf("%s",earth);
}

int main()
{
    char earth[15],mars[15],que[3030];
    cin>>earth;
    root=init();
    while(scanf("%s",earth))
    {
        if(earth[0]=='E') break;
        scanf("%s",mars);
        insert(earth,mars);
    }
    cin>>mars;
    getchar();
    while(gets(que))
    {
        if(que[0]=='E') break;
        int len=strlen(que);
        for(int i=0;i<len;i++)
        {
            if(islower(que[i]))
            {
                int cnt=0;
                while(islower(que[i]))
                  earth[cnt++]=que[i++];
                earth[cnt]='\0';
                find(earth);
            }
            printf("%c",que[i]);
        }
        printf("\n");
    }
    return 0;
}


你可能感兴趣的:(HDU1075 What Are You Talking About Tire树)