传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1075
就是先给你一些单词的翻译,之后再给你一句话然你翻译一下。
字典树可以做,map也可以做。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
using namespace std;
typedef struct Trie_node
{
struct Trie_node *nexts[26];
bool exist;
char translate[12]; //翻译
} TrieNode,*Trie;
TrieNode* CreatTrieNode() //创造节点啦
{
TrieNode *node=new TrieNode;
node->exist=false;
memset(node->nexts,NULL,sizeof(node->nexts));
return node;
}
void InsertNode(Trie root,char *s,char *trans) //加入 串到树种
{
TrieNode *p=root;
char *str=s;
int index;
while(*str)
{
index=*str-'a';
if(p->nexts[index]==NULL)
{
p->nexts[index]=CreatTrieNode();
}
p = p->nexts[index];
str++;
}
p->exist=true;
strcpy(p->translate,trans); //这里是处理翻译的阶段
}
char* Trie_search(Trie root,char *s)
{
Trie p=root;
int id;
char *word=s;
while(*word)
{
id=*word-'a';
p=p->nexts[id];
if(p==NULL)
return 0;
word++;
}
if(p->exist)
return p->translate;
else return NULL; //查找阶段,找到就返回字符指针,反之NULL
}
int main()
{
char input[3005];
Trie root=CreatTrieNode();
scanf("%s",input); //这题我觉得最烦人的在输入上。
char tras[11],word[11],language[3005];
while(scanf("%s",tras)&&strcmp(tras,"END")!=0)
{
scanf("%s",word);
InsertNode(root,word,tras);
} // 字典结束
scanf("%s",input); //开始翻译
getchar();
int pos=0;
char *ans;
while(gets(language)&&strcmp(language,"END")!=0)
{
char language_word[13];
for(int i=0;language[i];i++)
{
if(language[i]>='a'&&language[i]<='z')
{
language_word[pos++]=language[i];
}
else //对给你的那句话进行处理
{
language_word[pos]='\0';
ans=Trie_search(root,language_word); //找树中有的 翻译
if(ans)
{
printf("%s",ans);
}
else
printf("%s",language_word);
pos=0;
printf("%c",language[i]); //因为当前字符不在 a~z之间所以输出当前字符
}
}
cout<<endl;
}
return 0;
}