POJ2503 Babelfish Tire树

题目大意:给出一个单词之间的意义对应关系,然后有若干次询问,每次询问给出一个单词,让你输出与该单词对应的单词。


分析:map可以做,tire树也行。可以说是 HDU1075 的简易版。不过这题真正纠结人的是输入部分====卡了我n久啊。


实现代码如下:

#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;
    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;
    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\n",p->dic);
    else printf("eh\n");
}

int main()
{
    char earth[15],mars[15],str[30];
    root=init();
    while(gets(str)&&str[0]!='\0')
    {
        int len=strlen(str);
        int i=0,cnt=0;
        for(;i<len;i++)
        {
            if(str[i]==' ') break;
            earth[cnt++]=str[i];
        }
        earth[cnt]='\0';
        i++;
        cnt=0;
        for(;i<len;i++)
          mars[cnt++]=str[i];
        mars[cnt]='\0';
        insert(earth,mars);
    }
    while(gets(mars)&&mars[0]!='\0')
      find(mars);
    return 0;
}


你可能感兴趣的:(POJ2503 Babelfish Tire树)