题意:
中文题。。。。
解题思路:
利用字符串hash或map可求
注意:
无
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 110
#define MAZE 100010
#define mod 100003
char mz[MAXN],gn[MAXN],str[MAXN],str1[MAXN*2];
char hashmz[MAZE][81];
char hashgn[MAZE][21];
bool vis1[MAZE],vis2[MAZE];
int ind1[MAZE],ind2[MAZE];
inline int ELFhash(char *key)
{
unsigned long h = 0;
unsigned long g;
while( *key )
{
h =( h<< 4) + *key++;
g = h & 0xf0000000L;
if( g ) h ^= g >> 24;
h &= ~g;
}
return (int)h;
}
void get(char *all,char * mz,char *gn){
// sscanf(all,"%s%s",mz,gn);
bool flag = false;
all++;
while((*all)!=0){
if((*all)==']'){
(*mz) = 0;
all++;
all++;
flag = true;
}
if(flag==false){
(*mz) = (*all);
mz++;
}
else {
(*gn) = (*all);
gn++;
}
all++;
}
(*gn) = 0;
}
void prepro(char *key){
char tmp[MAXN];
int cnt = 0;
char *p = key;
while((*key)!=0){
if(((*key)>='a'&&(*key)<='z')||((*key)>='A'&&(*key)<='Z')){
tmp[cnt++] = (*key);
}
key++;
}
tmp[cnt] = 0;
strcpy(p,tmp);
}
void mkhash(char *mz,char *gn){
char tmp[MAXN];
strcpy(tmp,mz);
prepro(mz);
int hashnum = ELFhash(mz);
int ind = hashnum%mod;
while(vis1[ind]&&ind1[ind]!=hashnum){
ind++;
ind%=mod;
}
vis1[ind] = true;
ind1[ind] = hashnum;
strcpy(hashmz[ind],gn);
prepro(gn);
hashnum = ELFhash(gn);
ind = hashnum%mod;
while(vis2[ind]&&ind2[ind]!=hashnum){
ind++;
ind%=mod;
}
vis2[ind] = true;
ind2[ind] = hashnum;
strcpy(hashgn[ind],tmp);
}
int ismz(char *key,int hashnum){
int ind = hashnum%mod;
int cnt=0;
while(cnt<mod){
if(vis1[ind]&&ind1[ind]==hashnum)
return ind;
ind++;
ind%=mod;
cnt++;
}
return -1;
}
int isgn(char *key,int hashnum){
int ind = hashnum%mod;
int cnt = 0;
while(cnt<mod){
if(vis2[ind]&&ind2[ind]==hashnum)
return ind;
ind++;
ind%=mod;
cnt++;
}
return -1;
}
void solve(char *key){
prepro(key);
int hashnum = ELFhash(key);
int ind;
if((ind = ismz(key,hashnum))!=-1){
printf("%s\n",hashmz[ind]);
return;
}
if((ind = isgn(key,hashnum))!=-1){
printf("%s\n",hashgn[ind]);
return;
}
printf("what?\n");
}
int main(){
// for(int i=100001;;++i){
// bool flag = false;
// for(int j=2;j<=sqrt(i*1.0);++j){
// if(i%j==0){
// flag=true;
// break;
// }
// }
// if(!flag){
// printf("%d\n",i);
// break;
// }
// }
memset(vis1,false,sizeof(vis1));
memset(vis2,false,sizeof(vis2));
// memset(ind1,-1,sizeof(ind1));
// memset(ind2,-1,sizeof(ind2));
while(gets(str1)){
if(strcmp(str1,"@END@")==0)break;
get(str1,mz,gn);
mkhash(mz,gn);
}
int N;
scanf("%d",&N);
getchar();
while(N--){
gets(str);
solve(str);
}
return 0;
}