这个题就是一个字典树的问题,字典树翻译火星文,不难,但是我在这个题里遇到了大坑。
我才知道scanf一般不直接读入string,而是读入基本数据类型。用char*代替,而后我又遇到了getchar的问题,我还好奇为什么pe了,原来是cin或者scanf后后面继续读入char的话可能出现读入为空的情况。
解释如下
点击打开链接
代码在下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include<malloc.h>
#define MAX 3111
using namespace std;
struct Node{
string res ;
int flag ;
Node * next[26];
Node(){
for(int i = 0 ; i<26 ; i++)
{
next[i]=NULL;
}
flag = 0 ;
}
};//字典树节点
Node *p,*root=new Node();
//插入操作
void inSert(string a , string b)
{
p = root ;
for(int i = 0 ; i<strlen(a.c_str()) ; i++)
{
int temp = a[i]-'a';
if(p->next[temp]==NULL)
{
p->next[temp]= new Node();
}
p = p->next[temp];
}
p->res = b ;
p->flag = 1 ;
}
//查找结点
string Search(string s){
p = root;
for(int i = 0 ; i <strlen(s.c_str());i++)
{
int temp = s[i]-'a';
if(p->next[temp]==NULL)
{
return s;
}
p=p->next[temp];
}
if(p->flag==1)
return p->res;
else
return s ;
}
char from[MAX];
int main()
{
string start;
char English[MAX],Mars[MAX];
string temp ;
cin>>start;
string ans;
while(cin>>English&&strcmp(English,"END")!=0)
{
cin>>Mars;
inSert(Mars,English);
}
cin>>start;
getchar();//这个必须加上,不知道为什么哇
while(gets(from)&&strcmp(from,"END")!=0)
{
temp= "";
ans= "";
for(int i = 0 ; i< strlen(from);i++)
{
if(from[i]<='z'&&from[i]>='a')
{
temp+=from[i];
}else {
ans+=Search(temp);
ans+=from[i];
temp="";
}
}
cout << ans<<endl;
}
return 0;
}