hdu 1880

題意:

中文題。。。。


解題思路:

利用字符串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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章