POJ 2503 Babelfish(字典树Trie)
http://poj.org/problem?id=2503
题意:
给你一个标准英语单词到方言单词的映射表,然后再给你一系列的方言单词,要你输出每个方言单词对应的英语单词。
分析:
本题直接用map映射查找很可能会超时,所以用字典树Trie来处理。字典树节点v=0表示非单词节点,如果v=1表示单词节点,并且字典树节点还有一个string属性,用来保存对应的每个方言单词对于的英语单词。
AC代码:1A
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
using namespace std;
const int maxnode=1000000+100;
const int sigma_size=26;
struct Trie
{
int ch[maxnode][sigma_size];
int val[maxnode];
string str[maxnode];
int sz;
void init()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
val[0]=0;
}
void insert(char *s,string ss)
{
int n=strlen(s),u=0;
for(int i=0;i<n;i++)
{
int id=s[i]-'a';
if(ch[u][id]==0)
{
ch[u][id]=sz;
val[sz]=0;
memset(ch[sz],0,sizeof(ch[sz]));
sz++;
}
u=ch[u][id];
}
str[u]=ss;
val[u]=1;
}
string find(char *s)
{
int n=strlen(s),u=0;
for(int i=0;i<n;i++)
{
int id=s[i]-'a';
if(ch[u][id]==0)
{
return string("eh");
}
u=ch[u][id];
}
return str[u];
}
}trie;
char word[2][30];
char s[50];
int main()
{
trie.init();
while(gets(s))
{
if(strcmp(s,"")==0)
break;
int len=strlen(s);
int i,j;
for(i=0;i<len;i++)
{
if(s[i]==' ')
break;
word[0][i]=s[i];
}
word[0][i]=0;
i++;
for(j=0;j+i<len;j++)
word[1][j]=s[j+i];
word[1][j]=0;
trie.insert(word[1],string(word[0]));
}
while(gets(s))
{
cout<<trie.find(s)<<endl;
}
return 0;
}