【一题多解】 map 二分 hash trie poj 2503
各种方式解这道题!!
利用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的更多相关文章
- python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)
python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(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 ...
- BZOJ4698: Sdoi2008 Sandy的卡片(二分 hash)
题意 题目链接 Sol 用什么后缀数组啊 直接差分之后 二分+hash找最长公共子串就赢了啊... 时间复杂度:\(O(nlogn)\)(不过我写的是两个log..反正也能过) // luogu-ju ...
- LOJ#111. 后缀排序(二分 hash)
题意 给出一个字符串,求出排名为$i$个字符串在原串中的开始位置 Sol 纪念一下这伟大的时刻qwq. 我用二分+hash把这题水过去了qwq. #include<cstdio> #inc ...
- luogu2312 解方程 (数论,hash)
luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...
- 短文评估【安徽省选2003】- hash / trie
题目分析 其实是hash/trie裸题,讲一下hash的做法:如果其小写状态是第一次出现则加入集合,同时将小写状态加入小写单词的hash表,最后查时查出出现次数即可. code #include< ...
- BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6243 Solved: 2007[Submit] ...
- SQLServer 常见SQL笔试题之语句操作题详解
SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...
- 牛客网 Java 工程师能力评估 20 题 - 详解
牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...
随机推荐
- 《JS中的面向对象技术》
内容要点: 1.什么是对象:JS权威指南学习总结-第六章 ,(有句话:一切都是对象) 2.什么面向对象 使用对象时,只关注对象提供的功能,不关注其内部细节,比如jQuery.面向对象是一种通用思想,并 ...
- 2016年团体程序设计天梯赛-决赛 L1-7. 到底是不是太胖了(10)
据说一个人的标准体重应该是其身高(单位:厘米)减去100.再乘以0.9所得到的公斤数.真实体重与标准体重误差在10%以内都是完美身材(即 |真实体重-标准体重| < 标准体重x10%).已知市斤 ...
- about hibernate lazy load and solution
about hibernate lazy load is that used when loaded again.it can increase efficienty and sava memory. ...
- Linux help websites
FAQ
- 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 ...
- HttpReceiveRequestEntityBody 使用应注意的地方
如果EntityBody数据很大,调用此函数是不能完全接收全部数据的,我们不能简单的判断 1: BYTE* pBuffer = new BYTE[4096]; 2: ZeroMemory(pBuffe ...
- Openjudge-计算概论(A)-单词倒排
描述: 编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔. 输入输入为一个字符串(字符串长度至多为100).输出输出为按要求排续后的字符 ...
- Android应用测试性能的工具Emmagee,导出文件格式问题分析
原文引用自:http://www.open-open.com/lib/view/open1367026451078.html Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资 ...
- MTK平台Android项目APK预置方案
项目开发中,通常需要向系统中预置一些APK,这里简单介绍一下MTK平台预置APK的方法. 需要预置的apk可以放置在目录:vendor/mediate/${Project}/artifacts/out ...
- 复用TCP连接提升流媒体服务器之间流量转发效率
由于媒体推流客户端所在地域不同.所接入网络运营商不同.就近接入原则等因素,导致不同的视频推流客户端会推流至不同的流媒体服务器(本文主要针对目前WEB或手机的基于TCP的流媒体服务器),在某流媒体服务器 ...