zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    【Hadoop环境搭建】Centos6.8搭建hadoop伪分布模式
    【Java安装】Centos6.8 安装Java1.6
    【SVN】win7 搭建SVN服务器
    【KVM】Ubuntu14.04 安装KVM
    【VNC】Ubuntu14.04LTS下安装VNC View
    【虚拟化】支持IDE/SATA/SCSI
    【KVM安装】在Centos6.8中安装KVM
    【脚本】新增未扩展磁盘容量
    【SVN】自动定时更新
    【GIS】地球经纬度和米换算(转)
  • 原文地址:https://www.cnblogs.com/panweishadow/p/3041525.html
Copyright © 2011-2022 走看看