现在的位置: 首页 > 综合 > 正文

hdu(1880):魔咒词典——字符串hash的应用

2019年09月02日 ⁄ 综合 ⁄ 共 1479字 ⁄ 字号 评论关闭

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1880

题目讲的是,给出n对字符串,给出其中一者,输出另一者。主要是练习BKDHash的使用。

 

刚开始用到了map,但是MLE了,后来改善了一下,打了个擦边球,差一点点就MLE了,不过还是AC了。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<map>

using namespace std;

vector<string> F,E;//分别存储前半部分和后半部分
vector<int> f_h_p[100000],f_p_h[100000],e_h_p[100000],e_p_h[100000];
//f_h_p[i]F对应hash值i所包含的输入序号
//f_p_h[i]F对应输入序号的字符串所在的hash值
//......

int BKDHash(char *c){
    int hash=0;
    while(*c) hash=hash*31+(*c++);
    return (hash&0x7fffffff)%100000;
}

char ch[300];
int main(){
    //freopen("C:\\Documents and Settings\\All Users\\×ÀÃæ\\in.txt","r",stdin);
    string s,ss;
    int cnt=0;
    while(scanf("%[^\n]",ch)!=EOF){
        getchar();//吸收回车
        if(strcmp(ch,"@END@")==0) break;
        char *cch=ch;
        s.clear();ss.clear();
        for(;*cch!=' ';cch++)
            s+=*cch;//获取前半段
        for(cch++;*cch;cch++)
            ss+=*cch;//获取后半段
        F.push_back(s);E.push_back(ss);
        int t1=BKDHash(&s[0]),t2=BKDHash(&ss[0]);
        f_h_p[t1].push_back(cnt);f_p_h[cnt].push_back(t1);
        e_h_p[t2].push_back(cnt);e_p_h[cnt].push_back(t2);
        cnt++;
        //cout<<s<<":"<<ss<<endl;
    }
    int n;cin>>n;getchar();//吸收回车
    for(int i=0;i<n;i++){
        scanf("%[^\n]",ch);getchar();
        int t=BKDHash(ch);
        int op=0;
        if(*ch!='['){
            for(int j=0;j<e_h_p[t].size();j++){
                int p=e_h_p[t][j];
                if(strcmp(&E[p][0],ch)==0){
                    for(int k=1;k<F[p].size()-1;k++)
                        cout<<F[p][k];
                    cout<<endl;
                    op=1;
                    break;
                }
            }
        }else{
            for(int j=0;j<f_h_p[t].size();j++){
                int p=f_h_p[t][j];
                if(strcmp(&F[p][0],ch)==0){
                    cout<<E[p]<<endl;
                    op=1;
                    break;
                }
            }
        }
        if(!op) cout<<"what?\n";
    }
    return 0;
}

 

 

 

 

抱歉!评论已关闭.