Aizu - ALDS1_4_C Dictionary

Posted sunjianzhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

搜索的应用--计算最优解:Aizu - ALDS1_4_D Allocation

Queue ,( Aizu - ALDS1_3_B )

[Aizu] ALDS1_13_A: 8 Queens Problem

c_cpp http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_B&lang=jp

Stack,( Aizu - ALDS1_3_A)

Aizu - ALDS1_1_CPrime Numbers(素数筛法)