Aizu - ALDS1_4_C Dictionary
Search III
Your task is to write a program of a simple dictionary which implements the following instructions:
- insert str: insert a string str in to the dictionary
- find str: if the distionary contains str, then print 'yes', otherwise print 'no'
Input
In the first line n, the number of instructions is given. In the following n lines, n instructions are given in the above mentioned format.
Output
Print yes or no for each find instruction in a line.
Constraints
- A string consists of 'A', 'C', 'G', or 'T'
- 1 ≤ length of a string ≤ 12
- n ≤ 1000000
Sample Input 1
5
insert A
insert T
insert C
find G
find A
Sample Output 1
no
yes
Sample Input 2
13
insert AAA
insert AAC
insert AGA
insert AGG
insert TTT
find AAA
find CCC
find CCC
insert CCC
find CCC
insert T
find TTT
find T
Sample Output 2
yes
no
no
yes
yes
yes 做这道题用散列查找,但是我写的第一个开放地址法,显示超时,于是我又用链地址进行求解,最后通过AC,毕竟链地址对于冲突的出现非常少,但是也因为链地址的实现比较复杂容易出错
(毕竟是使用指针来实现的),所以首选不会使用链地址,但不可否认的是链地址的确效率很高。
链地址AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<malloc.h>
using namespace std;
const int maxn=1e6+10;
const int MAX=999983;
long long int zhuanhuan(char s[]);
struct node
{
long long int b;
struct node *p;
}a[maxn];
int main()
{
int n;
for(int i=0;i<maxn;i++)
a[maxn].b=0,a[maxn].p=NULL;
char str1[10],str2[20];
cin>>n;
while(n--)
{
scanf("%s%s",str1,str2);
long long int u=zhuanhuan(str2);
int m=u%MAX;
if(strcmp(str1,"insert")==0)
{
struct node *next=a[m].p;
if(a[m].b==0) a[m].b=u,a[m].p=(struct node *)malloc(sizeof(struct node)),a[m].p->b=0,a[m].p->p=NULL;
else
{
while(1)
{
if(next->b==0)
{
next->b=u;
next->p=(struct node *)malloc(sizeof(struct node));
next->p->b=0;
next->p->p=NULL;
break;
}
else next=next->p;
}
}
}
else
{
if(a[m].b==u) cout<<"yes"<<endl;
else
{
if(a[m].p==NULL) cout<<"no"<<endl;
else
{
struct node *next=a[m].p;
while(1)
{
if(next->b==u) {cout<<"yes"<<endl;break;}
else
{
if(next->p==NULL)
{
cout<<"no"<<endl;
break;
}
else next=next->p;
}
}
}
}
}
}
return 0;
}
long long int zhuanhuan(char s[])
{
long long int sum=0;
for(int i=0;s[i]!='\0';i++)
{
switch(s[i])
{
case 'A':sum+=1*pow(10,i);break;
case 'G':sum+=2*pow(10,i);break;
case 'C':sum+=3*pow(10,i);break;
case 'T':sum+=4*pow(10,i);break;
}
}
return sum;
}
到了第二天,还是不死心,仍旧想除链地址外的其他方法做出,因为我认为只要散列函数写得好,应该可以做出,可以不超时。但即便用再散列函数法,依旧还不行。但皇天不负有心人,最终让我AC了,但是在第一天的基础上仅仅改了一个地方,让我非常的无奈,为什么一开始就没有想到,现附上AC代码,并在改的地方加上注释:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn=1e6+10;
const int MAX=999983;
long long int zhuanhua(char s[]);
int main()
{
long long int a[maxn],n;
char str1[10],str2[15];
cin>>n;
while(n--)
{
scanf("%s%s",str1,str2);
long long int sum=zhuanhua(str2);
int m=sum%MAX;
int s=0;
if(str1[0]=='i')
{
int i=0;
do
{
if(a[(m+i)%MAX]==0)
{
a[(m+i)%MAX]=sum;
break;
}
if(a[(m+i)%MAX]==sum) break; //这句话在insert中遇到极端情况(有许多insert都是一样的时候)可以很大效率上减少冲突
} while(++i);
if(i>s) s=i;
}
else
{
int i=0;
do
{
if(a[(m+i)%MAX]==0)
{
cout<<"no"<<endl;
break;
}
if(a[(m+i)%MAX]==sum)
{
cout<<"yes"<<endl;
break;
}
}while(++i);
}
}
return 0;
}
long long int zhuanhua(char s[])
{
long long int sum=0;
for(int i=0;s[i]!='\0';i++)
{
switch(s[i])
{
case 'A':sum+=1*pow(5,i);break; //我本人认为这里的算法应该是使得对应的值唯一,可是我自己没有将其进行数理逻辑证明
case 'G':sum+=2*pow(5,i);break;
case 'C':sum+=3*pow(5,i);break;
case 'T':sum+=4*pow(5,i);break;
}
}
//cout<<sum<<endl;
return sum;
}
散列法属于一种搜索 存储的算法,利用个元素的值确定存储位置,于是也会利用个元素的值进行搜索。
Aizu - ALDS1_4_C Dictionary的更多相关文章
- C#数组,List,Dictionary的相互转换
本篇文章会向大家实例讲述以下内容: 将数组转换为List 将List转换为数组 将数组转换为Dictionary 将Dictionary 转换为数组 将List转换为Dictionary 将Dicti ...
- ASP.NET Aries JSAPI 文档说明:AR.DataGrid、AR.Dictionary
AR.Global 文档 1:对象或属性: 名称 类型 说明 DG 对象 DataGrid操作对象 //datagrid集合,根据ID取出DataGrid对象,将Json当数组用. Items: ne ...
- WebAPI接口返回ArrayList包含Dictionary对象正确解析
一.问题提出 为了减少流量,将key-value(键值对)直接输出到Dictionary<string, string>,接口返回结果如下: 其中{}里面内容如下: 上图显示600是键,4 ...
- Linq在Array,List,Dictionary中的应用
Linq在Array,List,Dictionary中的应用 今天在实际工作中需要对array,list,dictionary进行排序,试一试linq,发现非常好用,代码如下: using Syste ...
- python之最强王者(8)——字典(dictionary)
1.Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包 ...
- Swift3 - String 字符串、Array 数组、Dictionary 字典的使用
Swift相关知识,本随笔为 字符串.数组.字典的简单使用,有理解.使用错误的地方望能指正. ///************************************************** ...
- [LeetCode] Alien Dictionary 另类字典
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- Dictionary
命名空间:System.Collections.Generic(程序集:mscorlib) Dictionary<TKey, TValue> 类 一般用法:通过key获取value,k ...
- 关于 Dictionary<string,string>,和List<T>在View的使用
在MVC中Dictionary<string,string>如何应用到View页面中呢,例: <input type="text" name=key value= ...
随机推荐
- HTML+CSS ,原型
此图是别人所作
- python 正确复制list,克隆list 的各种方案
推荐4种方法 --------------------------------------------------------------- 方法一:extend L = [1, 2, 3] List ...
- SpringMVC Controller单例和多例(转)
首先上测试代码 import org.springframework.context.annotation.Scope; import org.springframework.stereotype.C ...
- openstack stein部署手册 5. placement
# 建立数据库用户及权限 create database placement; grant all privileges on placement.* to placement@'localhost' ...
- powerdesigner数据库设计
(1)创建物理数据模型 打开PowerDesigner,然后点击File-->New Model然后选择如下图所示的物理数据模型(物理数据模型的名字自己起,然后选择自己所使用的数据库即可) ( ...
- Linux性能优化从入门到实战:15 文件系统篇:磁盘 I/O
磁盘 磁盘是可以持久化存储的设备,按照存储介质来分类: (1)机械磁盘(硬盘驱动器,Hard Disk Driver,HDD),主要由盘片和读写磁头组成,数据就存储在盘片的环状磁道中.在读写数 ...
- 12JDBC
1.JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...
- 03SQL语句
数据库是不认识JAVA语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言SQL语句,它是数据库的代码. 结构化查询语言(Structured Query Language)简称SQL, ...
- opengl 单缓冲与双缓冲
1.说明 GLUT_SINGLE 指定单缓存窗口 GLUT_DOUBLE 指定双缓存窗口 应用程序使用单缓冲绘图时可能会存在图像闪烁的问题. 这是因为生成的图像不是一下子被绘制出来的,而是按照从左 ...
- vue 自定义封装组件 使用 model 选项
自定义组件的 v-model 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框.复选框等类型的输入控件可能会将 value 特性用于不同 ...