無意中看到這題,就切了一下,感覺這題很適合剛剛接觸散列表和字串處理的朋友,直接對字串hash就可以了,用map暴力不知道能不能過,沒有嘗試過。
My Code:
#include <cstdio><br />#include <cstring><br />#include <cstdlib><br />#include <algorithm><br />using namespace std;<br />const int MAX=210000;<br />const int mod=100007;<br />struct Node{<br />Node* ne;<br />char st[81];<br />}hash[MAX],*h[mod],*cur;<br />unsigned int BKDHash(char* s){<br />unsigned int seed=131;<br />unsigned int ret=0;</p><p>while(*s){<br />ret=ret*seed+*s++;<br />}</p><p>return (ret&0x7FFFFFFF)%mod;<br />}<br />int getId(char* s){<br />int code=BKDHash(s);<br />Node* ptr=h[code];</p><p>while(ptr){<br />if(strcmp(ptr->st,s)==0){<br />return ptr-hash;<br />}else{<br />ptr=ptr->ne;<br />}<br />}<br />strcpy(cur->st,s);<br />cur->ne=h[code];<br />h[code]=cur++;<br />return cur-hash-1;<br />}<br />int find(char* s){<br />int code=BKDHash(s);<br />Node* ptr=h[code];</p><p>while(ptr){<br />if(strcmp(ptr->st,s)==0){<br />return ptr-hash;<br />}else{<br />ptr=ptr->ne;<br />}<br />}<br />return -1;<br />}<br />int main(){<br />char s[100],*p;<br />int id,n;</p><p>cur=hash;<br />memset(h,0,sizeof(h));<br />while(scanf("%s",s),s[0]!='@'){<br />getId(s);<br />getchar();<br />gets(s);<br />getId(s);<br />}<br />scanf("%d",&n);<br />gets(s);<br />while(n--){<br />gets(s);<br />id=find(s);<br />if(id==-1){<br />puts("what?");<br />}else{<br />p=hash[id^1].st;<br />if(p[0]!='['){<br />puts(p);<br />}else{<br />p++;<br />while(*p!=']'){<br />putchar(*p++);<br />}<br />puts("");<br />}<br />}<br />}</p><p>return 0;<br />}<br />