题意:先构造一个词典,然后输入外文单词,输出相应的英语单词。
这道题有4种方法可以做:
1.map
2.字典树
3.快排+二分
4.hash表
参考博客:POJ2503两种解法:快速排序+二分查找与哈希表
思路1:可以使用map来做
代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<map>
using namespace std;
map<string,bool>appear;//记录单词的存在
map<string,string>translate;//记录单词的翻译
int main(){
char s[40];
char english[20];
char foreign[20];
while(gets(s) && s[0]){
sscanf(s,"%s%s",english,foreign);
appear[foreign]=true;
translate[foreign]=english;
}
while(scanf("%s",s)!=EOF){//vc6.0中需要按两下ctrl+z才能结束循环
if(appear[s]) cout<<translate[s]<<endl;//string 不能用printf输出
else printf("eh\n");
}
return 0;
}
vc6.0中需要按两下ctrl+z才能结束循环?详见:
EOF的使用
思路2:用字典树来做
代码:
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int MAX=26;
struct Trie {
Trie *next[MAX];
int v; //根据需要变化,1代表无此单词,-1代表有此单词
char english[20];
};
Trie *root=new Trie;
char s[40];
char english[20];
char foreign[20];
char out[20];//存储要输出的内容
void createTrie(char *str){
int len = strlen(str);
Trie *p = root, *q;
for(int i=0; i<len; ++i){
int id = str[i]-'a';
if(p->next[id] == NULL){
// q = (Trie *)malloc(sizeof(Trie));
q = new Trie;
q->v = 1; //初始v==1
for(int j=0; j<MAX; ++j)
q->next[j] = NULL;
p->next[id] = q;
}
p = p->next[id];
}
p->v = -1; //若为结尾,则将v改成-1表示
strcpy(p->english,english);
}
int findTrie(char *str){
int len = strlen(str);
Trie *p = root;
for(int i=0; i<len; ++i){
int id = str[i]-'a';
p = p->next[id];
if(p == NULL) //若为空集,表示不存以此为前缀的串
return 0;
}
if(p->v == -1){
strcpy(out,p->english);
return 1; //存在单词
}
return 0;
}
int main(){
int i;
for(i=0;i<MAX;i++)
root->next[i]=NULL;
while(gets(s) && s[0]){
sscanf(s,"%s%s",english,foreign);
createTrie(foreign);
}
while(scanf("%s",s)!=EOF){//vc6.0中需要按两下ctrl+z才能结束循环
if(findTrie(s)==1) printf("%s\n",out);
else printf("eh\n");
}
return 0;
}
思路3:快排+二分
代码:
思路4:hash表
代码: