zoukankan      html  css  js  c++  java
  • POJ 2503 Babelfish(map,字典树,快排+二分,hash)

    题意:先构造一个词典,然后输入外文单词,输出相应的英语单词。

    这道题有4种方法可以做:

    1.map

    2.字典树

    3.快排+二分

    4.hash表

    参考博客:[解题报告]POJ_2503 字典树,MAP

    参考博客:POJ2503两种解法:快速排序+二分查找与哈希表

    思路1:可以使用map来做

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<map>
    using namespace std;
    
    map<string,bool>appear;//记录单词的存在
    map<string,string>translate;//记录单词的翻译
    int main(){
    	char s[40];
    	char english[20];
    	char foreign[20];
    	while(gets(s) && s[0]){
    		sscanf(s,"%s%s",english,foreign);
    		appear[foreign]=true;
    		translate[foreign]=english;
    	}
    	while(scanf("%s",s)!=EOF){//vc6.0中需要按两下ctrl+z才能结束循环
    		if(appear[s]) cout<<translate[s]<<endl;//string 不能用printf输出
    		else printf("eh
    ");
    	}
    	return 0;
    }
    

    vc6.0中需要按两下ctrl+z才能结束循环?详见:EOF的使用 

    思路2:用字典树来做

    代码:

    #include<iostream>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    
    const int MAX=26;
    struct Trie   {
        Trie *next[MAX];
        int v;   //根据需要变化,1代表无此单词,-1代表有此单词
    	char english[20];
    };
    Trie *root=new Trie;
    
    char s[40];
    char english[20];
    char foreign[20];
    char out[20];//存储要输出的内容
    
    void createTrie(char *str){
        int len = strlen(str);
        Trie *p = root, *q;
        for(int i=0; i<len; ++i){
            int id = str[i]-'a';
            if(p->next[id] == NULL){
    			// q = (Trie *)malloc(sizeof(Trie));
    			q = new Trie;
                q->v = 1;    //初始v==1
                for(int j=0; j<MAX; ++j)
                    q->next[j] = NULL;
                p->next[id] = q;
    		}
    		p = p->next[id];
        }
        p->v = -1;   //若为结尾,则将v改成-1表示
    	strcpy(p->english,english);
    }
    int findTrie(char *str){
        int len = strlen(str);
        Trie *p = root;
        for(int i=0; i<len; ++i){
            int id = str[i]-'a';
            p = p->next[id];
            if(p == NULL)   //若为空集,表示不存以此为前缀的串
                return 0;
        }
    	if(p->v == -1){
    		strcpy(out,p->english);
    		return 1;   //存在单词
    	}
    	return 0;
    }
    
    int main(){
    	int i;
    	for(i=0;i<MAX;i++)
    		root->next[i]=NULL;
    
        while(gets(s) && s[0]){
            sscanf(s,"%s%s",english,foreign);
    		createTrie(foreign);
        }
        while(scanf("%s",s)!=EOF){//vc6.0中需要按两下ctrl+z才能结束循环
    
            if(findTrie(s)==1) printf("%s
    ",out);
            else printf("eh
    ");
        }
        return 0;
    }
    
    

    思路3:快排+二分

    代码:


    思路4:hash表

    代码:


  • 相关阅读:
    Windows Server 2008 R2系统上安装SQLServer2012集群(简略)
    播放视频有沙沙的杂音怎么处理?
    合并两个表取数
    电脑下边的语言栏跑到左边了怎么办?
    一条SQL查出当月的每一天
    统一本地服务器名和计算机名
    一个奇葩的SQL
    Cent Os7.0安装MongoDB4.2.0
    MySQL 8.0.5开启远程连接
    MySQL系统函数及SQL开发中易犯错的点
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4477392.html
Copyright © 2011-2022 走看看