POJ 2503 Babelfish(map,字典樹,快排+二分,hash)
阿新 • • 發佈:2019-02-03
題意:先構造一個詞典,然後輸入外文單詞,輸出相應的英語單詞。
這道題有4種方法可以做:
1.map
2.字典樹
3.快排+二分
4.hash表
思路1:可以使用map來做
程式碼:
vc6.0中需要按兩下ctrl+z才能結束迴圈?詳見:#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; }
思路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表
程式碼: