题目链接:传送门
题目就是要根据已知的火星文和英文的对照,要你翻译火星文,字典没有的按原来的输出。
就是查找字典树的单词,输出对应的英文单词,要注意的是英文单词要存在node节点上,开始时用数值存的,runtime error了。
#include <iostream>
#include <stdio.h>
#include<cstring>
using namespace std;
typedef struct node
{
node *next[26];
int p;
char d[11];
} node;
void init(node *a)
{
for(int i=0; i<26; i++)
a->next[i]=NULL;
a->p=0;
}
node *root=new node;
void Trie(char *s,char *s2)
{
int len=strlen(s),i;
node *temp=root;
for(i=0; i<len; i++)
{
if(temp->next[s[i]-'a'])temp=temp->next[s[i]-'a'];
else
{
node *n=new node;
init(n);
temp->next[s[i]-'a']=n;
temp=temp->next[s[i]-'a'];
}
}
temp->p=1;
strcpy(temp->d,s2);
}
char* Find(char *s)
{
int len=strlen(s);
node *temp=root;
for(int i=0; i<len; i++)
{
if(temp->next[s[i]-'a']==NULL)return s;
temp=temp->next[s[i]-'a'];
}
if(temp->p)return temp->d;
return s;
}
int main()
{
char s[3004],s2[3000+5];
char ch;
int i,len2=0,ans=0;
init(root);
scanf("%s",s);
while(scanf("%s",s2)&&strcmp(s2,"END"))
{
scanf("%s",s);
Trie(s,s2);
}
scanf("%s",s);
getchar();//注意,有个换行符
while(gets(s)&&strcmp(s,"END"))
{
int len=strlen(s);
len2=0;
for(i=0; i<len; i++)
{
if(islower(s[i]))
{
s2[len2++]=s[i];
}
else
{
s2[len2]='\0'; //将句子分为若干个单词
if(len2)
{
printf("%s",Find(s2)) ;
}
len2=0;
printf("%c",s[i]);
}
}
printf("\n");
}
return 0;
}