hdu 1880

来源:互联网 发布:淘宝店铺取名字大全 编辑:程序博客网 时间:2024/06/04 18:26

题意:

中文题。。。。


解题思路:

利用字符串hash或map可求


注意:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#define MAXN 110#define MAZE 100010#define mod 100003char 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;}


0 0
原创粉丝点击