魔咒词典 HDU - 1880

  感觉这题巨毒瘤,读入字符串方面调了好久才避免了读入空白字符。

  思路就是对每条信息的魔咒和功能的记录在S1和S2串里,并在ihash数组里通过信息的编号(cnt)确定存放的列,将魔咒(魔咒的hash值存在第一行)或功能(功能的hash值存在第2行)的hash值存入。然后输入一个要查找的字符串,就先求出其hash值,然后在去ihash数组里找。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<fstream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
#define ull unsigned long long
ull ihash[3][100005],base=1331;
char s1[100005][25],s2[100005][85];
int cnt;

ull myhash(char*p)
{
    ull ans=0;
    for(;*p!=0;p++)
     ans=ans*base+*p;
    return ans;
}
int main()
{
    cnt=1;
    while(1)
    {
        scanf(" %s",s1[cnt]);
        if(s1[cnt][0]=='@')
            break;
        int len=strlen(s1[cnt]);
        s1[cnt][len-1]=0;
        ihash[1][cnt]=myhash(s1[cnt]+1);
        //cout<<"1:"<<s1[cnt]+1<<endl;
        getchar();
        gets(s2[cnt]+1);
        //cout<<"1:"<<s2[cnt]+1<<endl;
        ihash[2][cnt]=myhash(s2[cnt]+1);
        cnt++;
    }
   // cout<<cnt-1<<endl;
    //for(int i=1;i<=cnt-1;i++)
    //{
     //   cout<<i<<"  "<<s1[i]+1<<" funtion: "<<s2[i]+1<<"    /对应hash值"<<ihash[1][i]<<"  "<<ihash[2][i]<<endl;
   // }
    int q;
    cin>>q;
    getchar();
    char s[100];
    while(q--)
    {
        gets(s);
       // cout<<s<<endl;
        if(s[0]=='[')
        {
            int len=strlen(s);
            s[len-1]=0;
            ull mb=myhash(s+1);
           // cout<<"/读入的字符串:"<<endl;
            //cout<<"/询问字符串的hash值"<<mb<<endl;
            int flag=0,ans;
            for(int i=1;i<=cnt-1;i++)
            {
                if(ihash[1][i]==mb)
                {
                    flag=1;
                    ans=i;
                    break;
                }
            }
            if(flag)
            {
                cout<<s2[ans]+1<<endl;
            }
            else
                cout<<"what?"<<endl;
        }
        else
        {
            ull mb=myhash(s);
            //cout<<"/询问字符串的hash值"<<mb<<endl;
            int flag=0,ans;
            for(int i=1;i<=cnt-1;i++)
            {
                if(ihash[2][i]==mb)
                {
                    flag=1;
                    ans=i;
                    break;
                }
            }
            if(flag)
            {
                cout<<s1[ans]+1<<endl;
            }
            else
                cout<<"what?"<<endl;
        }

    }
    return 0;
}

 

posted @ 2018-08-09 23:43  eason99  阅读(104)  评论(0编辑  收藏  举报