(雜湊法)Aizu - ALDS1_4_C
阿新 • • 發佈:2018-11-07
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define M 1046527 //設定為素數避免求模運算無法出現下標的情況 #define NLL (-1) #define L 14 #define ll long long int char H[M][L]; //char 轉 int 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; } //str 轉int 並生成 key ll getKey(char str[]) { ll sum = 0, p = 1,i; for(i = 0;i < strlen(str);i++){ sum += p*(getChar(str[i])); p *= 5; } return sum; } int h1(int key){ return key%M; } int h2(int key){ return 1 + (key%(M-1));} int Find(char str[]) { ll key,i,h; key = getKey(str); for(i = 0;;i++){ h = (h1(key) + i*h2(key))%M; if(strcmp(H[h],str) == 0) return 1; else if(strlen(H[h]) == 0) return 0; } return 0; } int Insert(char str[]) { ll key,i,h; key = getKey(str); for(i = 0;;i++){ h = (h1(key) + i*h2(key)) % M; if(strcmp(H[h],str) == 0) return 1; else if(strlen(H[h]) == 0){ strcpy(H[h],str); return 0; } } return 0; } int main() { int i,n,h; char str[L],com[9]; for(i = 0;i < M;i++){ H[i][0]= '\0'; } scanf("%d",&n); for(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; }