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
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1000433; //定义一个大于1000000的素数 1046527 1001451等
const int L=14;
char s[N][L]; //开一个大于N的数组空间
int h1(int key){return key % N;} //双重散列函数的定义
int h2(int key){return 1+(key%(N-1));}
int getChar(char ch){ //将字符转换为数字
if(ch=='A') return 1;
else if(ch=='C') return 2;
else if(ch=='G') return 3;
else if(ch=='T') return 4;
else return 0;
}
long long getkey(char str[]){ //将字符串转换为数字
long long sum=0,p=1;
int lena=strlen(str);
for(int i=0;i<lena;i++){
sum+=p*(getChar(str[i]));
p*=5;
}
return sum;
}
int insert(char str[]){
long long key,i,h;
key=getkey(str); //字符串转换为汉子后的值
for(int i=0;;i++){
h=(h1(key)+i*h2(key))%N; //经过哈希函数转换后的值
if(strcmp(s[h],str)==0) return 1; //如果这个位置已经有同样的字符串,则什么也不做;
else if(strlen(s[h])==0){ //如果这个位置为空,则插入;否则就是冲突,重新计算哈希值(寻找位置)进行插入
strcpy(s[h],str);
return 0;
}
}
return 0;
}
int find(char str[]){
long long key,i,h;
key=getkey(str);
for(i=0;;i++){
h=(h1(key)+i*h2(key))%N;
if(strcmp(s[h],str)==0) return 1; //如果找到,则返回;
else if(strlen(s[h])==0) return 0;//如果这个位置为空,说明没有;否则重新计算(寻找下一个位置)
}
return 0;
}
int main(){
int n;
char str[L],com[10];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s%s",com,str);
if(com[0]=='i') insert(str);
else if(find(str)) printf("yes\n");
else printf("no\n");
}
return 0;
}