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 }

 

posted @ 2022-05-01 16:25  TFLSNOI  阅读(37)  评论(0编辑  收藏  举报