Babelfish(单词翻译) POJ - 2503
题目链接:https://vjudge.net/problem/POJ-2503#author=koeikai
本题输入方式学习
方法一:MAP
1 #include<cstdio> 2 #include<iostream> 3 #include<map> 4 #include<cstring> 5 #include<string> 6 using namespace std; 7 map<string,string>mp; 8 int main() 9 { 10 char a[30],b[15],c[15]; 11 while(gets(a)&&a[0]!='\0')//输入一行字符串&&第一个字符不为空 12 { 13 sscanf(a,"%s %s",b,c);//将字符串a以空格间隔分别存放在b,c两个数组中 14 mp[c]=b; 15 } 16 char s[15]; 17 while(gets(s)&&s[0]!='\0') 18 { 19 if(mp[s][0]=='\0')cout<<"eh\n";//如找到为空 20 else cout<<mp[s]<<endl; 21 } 22 return 0; 23 24 }
方法二:字典树
1.将字典条目中的英语单词存储到数组中,将英语单词插入字典树中。
2.在字典树中查找待翻译的外语单词,输出对应的英语单词。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int maxl=1e6+100;//按照题目中要求开1e5会挂 5 char s[30], s1[maxl][15], str[15]; 6 7 int trie[maxl][26], ed[maxl], val[maxl], tot=1;//ed表示字符结束标志,val表示映射的单词下标 8 void trie_build(char st[], int k){//将字符串str及对应单词下标,插入字典树中。 9 int p=1; 10 int len=strlen(st); 11 for(int i=0; i<len; i++){ 12 int ch=st[i]-'a'; 13 if(!trie[p][ch]) 14 trie[p][ch]=++tot; 15 p=trie[p][ch]; 16 } 17 ed[p]=1; val[p]=k; 18 } 19 int trie_query(char st[]){ 20 int p=1; 21 int len=strlen(st); 22 for(int i=0; i<len; i++){ 23 int ch=st[i]-'a'; 24 p=trie[p][ch]; 25 if(!p) 26 return 0; 27 } 28 if(ed[p])//找到单词结束标志,并且返回对应单词下标 29 return val[p]; 30 return 0; 31 } 32 int main() 33 { 34 int k=0; 35 while(gets(s) && s[0]!='\0'){ 36 sscanf(s, "%s %s", s1[++k], str); 37 trie_build(str, k);// 将字符串str及对应单词下标,插入字典树中。 38 } 39 while(gets(s) && s[0]!='\0'){ 40 int t=trie_query(s); 41 if(t==0) 42 printf("eh\n"); 43 else 44 printf("%s\n", s1[t]); 45 } 46 return 0; 47 }