poj2503(简单hash)

题目大意:

                   输入不超过100000行;输入字典每行有两个单词前一个为英文后一个未知语言,单词中间有一空格;空行后表示查询

简单hash

#include<iostream>
#include<cstring>
using namespace std;

const int MAX=100003;
char word[MAX][11],dic[MAX][11];
int head[MAX],nextpos[MAX];

int calhash(char c[])
{
    int len = strlen(c);
    int sum = 0;
    for (int i=0; i<len; i++)
    {
        sum=sum*7+(c[i]-'a');
    }
    return sum%MAX;
}
void insert_table(int s,char ch[])
{
    int h=calhash(ch);
    nextpos[s]=head[h];
    head[h]=s;
}
int findstr(char ch[])
{
    int h=calhash(ch);
    int u=head[h];
    while (u)
    {
        if (strcmp(ch,dic[u])==0)
            return u;
        u=nextpos[u];
    }
    return 0;
}
void print(int u)
{
    int len = strlen(word[u]);
    for (int i=0; i<len; i++)
        cout<<word[u][i];
    cout<<endl;
}
int main ()
{
    char line[30];

    int dex=1;
    while (cin.getline(line,30)&&line[0]!='\0')
    {
        int i=0,j=0;
        while (line[i]!=' ')
        {
            word[dex][i]=line[i];
            i++;
        }
        word[dex][i++]='\0';
        while (line[i]!='\0')
        {
            dic[dex][j++]=line[i++];
        }
        dic[dex][j]='\0';
        insert_table(dex,dic[dex]);
        dex++;
    }
    while  (1)
    {
        char tar[11];
        cin.getline(tar,11);
        if (tar[0]=='\0') break;
        int flag=findstr(tar);
        if (flag>0)
            print(flag);
        else cout<<"eh"<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值