POJ 2503 Babelfish(map,字典树,快排+二分,hash)

题意:先构造一个词典,然后输入外文单词,输出相应的英语单词。

这道题有4种方法可以做:

1.map

2.字典树

3.快排+二分

4.hash表

参考博客:[解题报告]POJ_2503 字典树,MAP

参考博客: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
");
	}
	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
",out);
        else printf("eh
");
    }
    return 0;
}

思路3:快排+二分

代码:


思路4:hash表

代码:


原文地址:https://www.cnblogs.com/gongpixin/p/4477392.html