[解题报告]POJ_2503 字典树,MAP

题目很容易理解,就是每个字符串对应一个foreign字符串,然后给出foreign字符串,进行翻译

因为一开始没有学过字典树,很自然的就想到MAP了,水过之后,看了一下discuss,发现这一题的做法很多,可以用二分+查找,字典树,HASH等等,因为以前没有学习过字典树,就学习并试着写了一下,一次AC了..心情大好..关于字典树的学习帖子我发在前一篇了,是转载的~

 

字典树写法:

#include <iostream> #include <cstdio> #include <cstdio> #include <string.h> using namespace std; struct trie{ char v[12]; int has; trie *next[26]; }; void add(trie *root,char *w1,char *w2){ trie *p=root,*q; int len=strlen(w2); for(int i=0;i<len;i++){ int val=w2[i]-'a'; if(p->next[val]==NULL){ q=new trie; q->has=0; for(int j=0;j<26;j++){ q->next[j]=NULL; } p->next[val]=q; } p=p->next[val]; } p->has=1; strcpy(p->v,w1); } void find(trie *root,char *w1){ trie *p=root; int len=strlen(w1); int yes=1; for(int i=0;i<len;i++){ int val=w1[i]-'a'; p=p->next[val]; if(p==NULL){ yes=0; break; } } if(!yes||!p->has){ printf("eh/n"); }else{ printf("%s/n",p->v); } } int main(){ char line[12],w1[12],w2[12]; trie *root=new trie; for(int i=0;i<26;i++){ root->next[i]=NULL; } while(scanf("%s%s", w1,w2) != EOF){ add(root,w1, w2); getchar(); char ch = getchar(); if ('/n' != ch) { ungetc(ch, stdin); continue; } break; } while(scanf("%s",line)!=EOF){ find(root,line); } } 

 

MAP写法:

#include <iostream> #include <sstream> #include <map> #include <cstdio> #include <cstdlib> #include <string.h> using namespace std; int main(){ char line[12],w1[12],w2[12]; map<string,string> mp; map<string,string>::iterator it; while(gets(line)){ if(!strlen(line))break; int i=0,j=0,k=0; for(i=0;i<strlen(line);i++){ if(line[i]==' ')break; w1[j++]=line[i]; } w1[j]='/0'; j=0; i++; for(;i<strlen(line);i++){ w2[j++]=line[i]; } w2[j]='/0'; mp[w2]=w1; } while(scanf("%s",line)!=EOF){ it=mp.find(line); if(it==mp.end()){ printf("eh/n"); }else{ cout<<it->second<<endl; } } return 0; }  

你可能感兴趣的:([解题报告]POJ_2503 字典树,MAP)