1. 程式人生 > >POJ 2503 Babelfish(map,字典樹,快排+二分,hash)

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

題意:先構造一個詞典,然後輸入外文單詞,輸出相應的英語單詞。

這道題有4種方法可以做:

1.map

2.字典樹

3.快排+二分

4.hash表

思路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才能結束迴圈?詳見:

思路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表

程式碼: