题目传送门
伊格那丢很幸运,昨天他遇见了一个火星人。但是他不懂火星人使用的语言。火星人给了他一本关于火星的历史书和一本字典。现在伊格内修斯想把这本历史书译成英语。你能帮助他吗?
输入
问题只有一个测试用例,测试用例由两个部分组成,字典部分和书籍部分。字典部分从一行开始包含一个字符串“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);
}