POJ 2503 Babelfish(字典树Trie)

来源:互联网 发布:淘宝t恤100字好评评语 编辑:程序博客网 时间:2024/05/22 03:14

题目链接:点击打开链接

题目大意:

        给你一个标准英语单词到方言单词的映射表,然后再给你一系列的方言单词,要你输出每个方言单词对应的英语单词。

思路:

        本题直接用map映射查找很可能会超时,所以用字典树Trie来处理。字典树节点v=0表示非单词节点,如果v=1表示单词节点,并且字典树节点还有一个string属性,用来保存对应的每个方言单词对于的英语单词。

用c++AC:

#include<cstdio>#include<cstring>#include<vector>#include<iostream>#include<string>using namespace std;#define maxn 26;const int maxenode=1000000+100;const int maxnsize=26;struct Trie{int ch[maxenode][maxnsize];int val[maxenode];int sz;string str[maxenode];void clear(){sz=1;memset(ch[0],0,sizeof ch[0]);val[0]=0;}int idx(char x){return x-'a';}void insert (char *s,char *a){int u =0,n=strlen(s);for(int i=0;i<n;i++){int id=idx(s[i]);if(ch[u][id]==0){ch[u][id]=sz;val[sz]=0;memset(ch[sz],0,sizeof ch[sz]);sz++;}u=ch[u][id];}val[u]=1;str[u]=a;//strcpy(val[u],a);}string  find(char *s){int u=0;int len=strlen(s);for(int i=0;i<len;i++){int id=idx(s[i]);if(ch[u][id]==0)return string("eh");u=ch[u][id];}if(val[u]==0)return string("eh");return str[u];}}trie;char a[20],b[20],s[40];int main(){trie.clear();while(gets(s)){if(strcmp(s,"")==0)break;sscanf(s,"%s%s",a,b);trie.insert(b,a);}while(~scanf("%s",a)){cout<<trie.find(a)<<endl;}}