题意:输入 语言A及翻译为语言B的词典,之后再输入语言B的单词,判断是否能从词典中找到,
若能找到,将其翻译为语言A,否则输出“eh”.
思路:这题肯定得先将词典对应语言存起来,但是如果直接暴力找输入的单词是否出现过,必然会TLE
因为单词都是一对一的关系,可以用map实现
当然,trie树是用空间换时间,对于字符串的查找,在时间上有着相当的优势,因此也可以用trie树
注:sscanf函数,从一个字符串中读进与指定格式相符的数据.
map实现:938MS
#include<iostream> #include<map> #include<cstdio> #include<cstring> #include<string> using namespace std; int main() { map<string,string> word; map<string,string>::iterator i; char s[25],s1[15],s2[15]; while(gets(s)!=NULL){ if(strcmp(s,"")==0) break; sscanf(s,"%s %s",s1,s2); word[s2]=s1; } while(gets(s)!=NULL){ if((i=word.find(s))!=word.end()) cout<<i->second<<endl; else cout<<"eh"<<endl; } return 0; }
trie 树实现:422MS
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct stu { struct stu *next[26]; char s[12]; }node; node* creat_node() //创建新节点并初始化 { node *p=(node *)malloc(sizeof(node)); memset(p->next,0,sizeof(p->next)); return p; } void trie_insert(node *p,char *s,char *word) { int i; while(*s!='\0'){ i=*s-'a'; if(p->next[i]==0) p->next[i]=creat_node(); p=p->next[i]; s++; } strcpy(p->s,word); //将对应单词存起来 } void trie_search(node *p,char *s) { int i; while(*s!='\0'){ i=*s-'a'; p=p->next[i]; if(p==0){ printf("eh\n"); return ; } s++; } printf("%s\n",p->s); } int main() { node *root=NULL; char s[25],t[12],word[12]; root=creat_node(); while(gets(s)!=NULL){ if(strcmp(s,"")==0) break; sscanf(s,"%s %s",word,t); trie_insert(root,t,word); } while(gets(s)!=NULL) trie_search(root,s); return 0; }
poj 2503 Babelfish (map,trie 树)
时间: 2024-10-13 12:44:41