• 魔咒词典 HDU


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

      思路就是对每条信息的魔咒和功能的记录在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;
    }
  • 相关阅读:
    虚方法表与动态分派机制
    方法重载与invokevirtual字节码指令的关系
    栈桢与操作数栈以及符号引用与直接引用的转换
    通过字节码分析this关键字以及异常表的作用
    JVM synchronized关键字所生成的字节码
    window Chrome 下允许跨域访问服务端接口设置
    JVM Java字节码方法表与属性
    JVM 字节码的结构
    Jar hell问题以及解放方法
    JVM 线程上下文类加载器
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754977.html
Copyright © 2020-2023  润新知