各种方式解这道题!!

利用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. 《html表格》

    1.html表格 w3c School:http://www.jb51.net/w3school/html/html_tables.htm 2.<colgroup></colgrou ...

  2. 3种日志类型,微信付款反馈-->写入txt日志

    --> 接收  $GLOBALS["HTTP_RAW_POST_DATA"] ---->xml 反系列化$qr = XML_unserialize( $rowpost ...

  3. Matlab - 矩阵基本操作

    1. 矩阵的输入 右值是用方括号表示: , 逗号或空格分隔元素     ; 分号分隔行 >> A = [-, ; , ] A = - 2. 矩阵的加减 >> C = A + B ...

  4. 亲身体验:Vultr超高性价比VPS评测教程

    最具性价比的vps是哪家?综合考虑vps稳定性.机房速度.vps硬件配置,美国linode一度是vps市场里的王牌:digitalocean vps迅速介入云主机市场,SSD固态硬盘性能秒杀竞争对手, ...

  5. mac brew install 搭建nginx php mysql

    curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1 参考 : ...

  6. 第二次冲刺spring会议(第三次会议)

    [例会时间]2014/5/6 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇

  7. Openjudge-计算概论(A)-人民币支付

    描述: 从键盘输入一指定金额(以元为单位,如345),然后输出支付该金额的各种面额的人民币数量,显示100元,50元,20元,10元,5元,1元各多少张,要求尽量使用大面额的钞票. 输入一个小于100 ...

  8. c/c++常用的几个关键字总结

    一.volatile volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编 ...

  9. SQL 课程 连接查询

    今天,我主要是对前面所学习过的子查询进行了复习,然后学习了连接查询join on 的内容. 如: select renyuan.code,name,age ,sex , bumen.bname,bce ...

  10. Xcode调试之查看变量

    从其他开发语言转行进军IOS开发的小伙伴可能会有这样一件苦恼的事情,调试程序时如何查看变量值?我并不喜欢每次都要通过打印去查看变量的值,也不喜欢通过光标悬浮到变量上来显示变量的值,如果要查看变量的属性 ...