各种方式解这道题!!

利用map 超时了

#include <iostream>
#include <string>
#include <map>
using namespace std;
string s;
map<string,int> in;
int main()
{
in.clear();
int i=,num=;
char out[][];
char a[],b[],c[];
char ch=getchar();
while(ch!='\n')
{
int j=;
while(ch>='a' && ch<='z')
{
a[j++]=ch;
ch=getchar();
}
a[j]='\0'; while(ch>'z' || ch<'a')
ch=getchar(); j=;
while(ch>='a' && ch<='z')
{
b[j++]=ch;
ch=getchar();
}
b[j]='\0';//每个数组的结束符 num++;
s=b;
in[s]=num;
strcpy(out[num],a);
//while(ch!='\n') ch=getchar();
ch=getchar();
i++; } while(scanf("%s",c)!=EOF)
{
s=c;
i=in[s];
if(i>)
printf("%s\n",out[i]);
else
printf("eh\n");
}
system("pause");
return ;
}

二分查找

#include<iostream>
using namespace std; struct pp
{
char a[],b[];
}p[]; int cmp(void const *c,void const *d)
{
return strcmp(((pp *)c)->b,((pp *)d)->b);
} int binarysearch(char s[],int k)
{
int low=,hight=k+,mid;
while(low<=hight)
{
mid=(low+hight)/;
if(strcmp(p[mid].b,s)==) return mid;
else if(strcmp(p[mid].b,s)<) low=mid+;
else hight=mid-;
}
return -;
} int main()
{
char ch,s[];
int i,k,j,t;
ch=getchar();i=;p[].a[]=ch;k=-;
while()
{
k++;
while(ch!=' ') { p[k].a[i++]=ch; ch=getchar(); }
p[k].a[++i]='\0';i=;
ch=getchar();j=;
while(ch!='\n') { p[k].b[j++]=ch;ch=getchar(); }
p[k].b[j]='\0';j=;
ch=getchar();
if(ch=='\n')break;
} qsort(p,k+,sizeof(p[]),cmp); while(scanf("%s",s)!=EOF)
{
t=binarysearch(s,k);
if(t>=) printf("%s\n",p[t].a);
else printf("eh\n");
}
return ;
}

hash表

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
const int M=;//Hash Table的槽数,取质数对解决冲突较为有效
char English[][],Foreign[][];
struct node//Hash Table中的元素类型
{
int num;//记录英语数组中的标号
struct node *next;
}*link[M]={NULL};//槽中存放一个链表头指针(开散列解决冲突)
int ELFlash(char *key)// UNIX 系统ELF字符串散列函数,对字符串的处理一般使用此函数
{
unsigned long h=;
while (*key)
{
h=(h<<)+*key++;
unsigned long g=h & 0xf0000000L;
if (g) h^=g>>;
h &= ~g;
}
return h%M;
}
int main()
{
char st[];
int i,k;
node *p;
i=;
while (gets(st))
{
if (sscanf(st,"%s %s",English[i],Foreign[i])!=) break;//判断读入词典是否完毕
k=ELFlash(Foreign[i]);//计算Hash函数
p=new node;//建立Hash Table
p->num=i;
p->next=link[k];
link[k]=p;
i++;
}
while (gets(st)!=NULL)
{
k=ELFlash(st);
p=link[k];
while (p!=NULL)//在Hash Table中查找单词
{
if (strcmp(st,Foreign[p->num])==) break;//若找到则推出
p=p->next;
}
if (p==NULL) printf("eh\n");//没有找到的情况
else printf("%s\n",English[p->num]);
}
return ;
}

trie

#include<iostream>
using namespace std;
struct node{
node *child[];
char key[];
bool d;
}*root;
char s1[],s2[],s3[];
void trie(){
root=new node;
for(int i=;i<;i++) root->child[i]=NULL;
root->d=false;
}
void insert(){
node *r=root,*p;
int len=strlen(s3);
for(int i=;i<len;i++){
if(r->child[s3[i]-'a']==NULL){
p=new node; p->d=false;
for(int j=;j<;j++) p->child[j]=NULL;
r->child[s3[i]-'a']=p;
}
r=r->child[s3[i]-'a'];
if(i==len-){
r->d=true;
strcpy(r->key,s2);
}
}
}
bool search(){
node *r=root;
int len=strlen(s1);
for(int i=;i<len;i++){
r=r->child[s1[i]-'a'];
if(r==NULL) return false;
if(i==len- && r->d){
strcpy(s2,r->key);
return true;
}
}
return false;
}
int main()
{
int i,j,k,len;
trie();
while(true){
gets(s1); if(strcmp(s1,"")==) break;
for(i=;s1[i]!=' ';i++) s2[i]=s1[i];
for(i=i+, j=, len=strlen(s1);i<len;i++,j++) s3[j]=s1[i];
insert();
}
while(scanf("%s",s1)!=EOF){
if(search()) printf("%s\n",s2);
else printf("eh\n"); }
system("pause");
return ;
}

再来个通过的map..

#include <stdio.h>
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
// freopen("in.txt","r",stdin);
string s;
char ss[],s1[],s2[];
map <string,string> m;
map <string,string> ::iterator p;
while (gets(ss)) //建立map
{ s=ss;
if (s[]<'a' || s[]>'z' ) break;
else
{ sscanf(s.c_str(),"%s %s",s1,s2);
m[s2]=s1;
}
}
while (gets(ss)) //从map查询
{
s=ss;
if (s[]<'a' || s[]>'z' ) break;
p=m.find(s);
if ( p!=m.end())
cout << p->second <<endl;
else printf("eh\n");
}
return ;
}

【一题多解】 map 二分 hash trie poj 2503的更多相关文章

  1. python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)

    python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...

  2. [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))

    5109: [CodePlus 2017]大吉大利,晚上吃鸡! Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 107  Solved: 57[Sub ...

  3. BZOJ4698: Sdoi2008 Sandy的卡片(二分 hash)

    题意 题目链接 Sol 用什么后缀数组啊 直接差分之后 二分+hash找最长公共子串就赢了啊... 时间复杂度:\(O(nlogn)\)(不过我写的是两个log..反正也能过) // luogu-ju ...

  4. LOJ#111. 后缀排序(二分 hash)

    题意 给出一个字符串,求出排名为$i$个字符串在原串中的开始位置 Sol 纪念一下这伟大的时刻qwq. 我用二分+hash把这题水过去了qwq. #include<cstdio> #inc ...

  5. luogu2312 解方程 (数论,hash)

    luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...

  6. 短文评估【安徽省选2003】- hash / trie

    题目分析 其实是hash/trie裸题,讲一下hash的做法:如果其小写状态是第一次出现则加入集合,同时将小写状态加入小写单词的hash表,最后查时查出出现次数即可. code #include< ...

  7. BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6243  Solved: 2007[Submit] ...

  8. SQLServer 常见SQL笔试题之语句操作题详解

    SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...

  9. 牛客网 Java 工程师能力评估 20 题 - 详解

    牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...

随机推荐

  1. 《JS中的面向对象技术》

    内容要点: 1.什么是对象:JS权威指南学习总结-第六章 ,(有句话:一切都是对象) 2.什么面向对象 使用对象时,只关注对象提供的功能,不关注其内部细节,比如jQuery.面向对象是一种通用思想,并 ...

  2. 2016年团体程序设计天梯赛-决赛 L1-7. 到底是不是太胖了(10)

    据说一个人的标准体重应该是其身高(单位:厘米)减去100.再乘以0.9所得到的公斤数.真实体重与标准体重误差在10%以内都是完美身材(即 |真实体重-标准体重| < 标准体重x10%).已知市斤 ...

  3. about hibernate lazy load and solution

    about hibernate lazy load is that used when loaded again.it can increase efficienty and sava memory. ...

  4. Linux help websites

    FAQ

  5. Leetcode 073 Set Matrix Zeroes

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click ...

  6. HttpReceiveRequestEntityBody 使用应注意的地方

    如果EntityBody数据很大,调用此函数是不能完全接收全部数据的,我们不能简单的判断 1: BYTE* pBuffer = new BYTE[4096]; 2: ZeroMemory(pBuffe ...

  7. Openjudge-计算概论(A)-单词倒排

    描述: 编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔. 输入输入为一个字符串(字符串长度至多为100).输出输出为按要求排续后的字符 ...

  8. Android应用测试性能的工具Emmagee,导出文件格式问题分析

    原文引用自:http://www.open-open.com/lib/view/open1367026451078.html Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资 ...

  9. MTK平台Android项目APK预置方案

    项目开发中,通常需要向系统中预置一些APK,这里简单介绍一下MTK平台预置APK的方法. 需要预置的apk可以放置在目录:vendor/mediate/${Project}/artifacts/out ...

  10. 复用TCP连接提升流媒体服务器之间流量转发效率

    由于媒体推流客户端所在地域不同.所接入网络运营商不同.就近接入原则等因素,导致不同的视频推流客户端会推流至不同的流媒体服务器(本文主要针对目前WEB或手机的基于TCP的流媒体服务器),在某流媒体服务器 ...