HDU/HDOJ 1075 What Are You Talking About(字典树|STL map)

原文地址:http://www.wutianqi.com/?p=2467

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1075

这题用字典树Trie做很麻烦,用STL map要简单多了。

字典树的讲解;

http://www.wutianqi.com/?p=1359

这个是网上一位朋友的代码,分别是用字典树和map做的:

// 字典树

#include<iostream>

#include<string>

using namespace std;

int i;

struct dictree

{

    dictree *child[26];

    char engWord[11];

    dictree()//初始化非常的有必要

    {

        for(i=0;i<26;i++)

            child[i] = NULL;

        engWord[0]='\0';

    }

};

dictree root;

void insert(char eng[],char mar[])//构建字典树

{

    dictree *now = &root;

    char *tmp = mar;

    while(*tmp)

    {

        if(now->child[*tmp-'a']==NULL)

            now->child[*tmp-'a'] = new dictree;

        now = now->child[*tmp-'a'];

        tmp++;

    }

    strcpy(now->engWord,eng);    

}

 

char *find(char ch[])//查找单词

{

    dictree *p = &root;

    int k=0;

    while(1)

    {

        if(ch[k]=='\0' || p->child[ch[k]-'a']==NULL)

            break;

        p = p->child[ch[k]-'a'];

        k++;

    }

    if(ch[k]=='\0' && strcmp(p->engWord,"")!=0)

        return p->engWord;

    return NULL;

}

 

int main()

{

    char a[11],b[11];

    scanf("%s",a);//"START"

    while(scanf("%s",a) && strcmp(a,"END")!=0 )

    {

        scanf("%s",b);

        insert(a,b);

    }

    scanf("%s",a);//"START"

    getchar();//吃回车

    char tmp[3002];

    while(1)

    {

        gets(tmp);//用这个比getline()强

        if(strcmp(tmp,"END") == 0 )

            break;

        int i,len,k=0;

        len = strlen(tmp);

        tmp[len]=' ';//多加一个' ',输出的时候注意

        tmp[++len]='\0';

        char tp[3002];

        for(i=0;i<len;i++)

        {

            if(!(tmp[i]>='a' && tmp[i]<='z'))//非小写字母

            {

                tp[k]='\0';

                char *temp = find(tp);//查找是否有对应的engWord

                if(temp)//存在这个单词

                    printf("%s",temp);

                else                                                    

                    printf("%s",tp);//可以用cout<<tp;//不可以用puts(tp);用puts有换行

                k=0;

                if(i!=len-1)//最后有一个' '是多余的

                    cout<<tmp[i];//输出非小写字母字符

            }

            else //小写字母

                tp[k++]=tmp[i];

        }

        cout<<endl;

    }

    return 0;

} 

STL map:

// STL map

#include<iostream>

#include<string>

#include<map>

using namespace std;

map<string,string>M;

int main()

{

    string a,b;

    cin>>a;//"START"

    while(cin>>a && a!="END")

    {

        cin>>b;

        M[b] = a;

    }

    cin>>a;//"START"

    getchar();//吃回车

    char tmp[3005];

    while(1)

    {

        gets(tmp);//用这个比getline()强

        if(strcmp(tmp,"END") == 0 )

            break;

        int i,len;

        len = strlen(tmp);

        b = "";

        for(i=0;i<len;i++)

        {

            if(!(tmp[i]>='a' && tmp[i]<='z'))//非小写字母

            {

                if(M[b]!="")//存在这个单词

                    cout<<M[b];

                else

                    cout<<b;

                b="";

                cout<<tmp[i];

            }

            else //小写字母

                b+=tmp[i];

        }

        cout<<endl;

    }

    return 0;

}

 

你可能感兴趣的:(map)