POJ 2503 Babelfish(字典树Trie)

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;
}


你可能感兴趣的:(ACM)