zoukankan      html  css  js  c++  java
  • 魔咒词典(hdu 1880)

    Problem Description
    哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。

    给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”
     
    Input
    首先列出词典中不超过100000条不同的魔咒词条,每条格式为:

    [魔咒] 对应功能

    其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
    词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。
     
    Output
    每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”
     
    Sample Input
    [expelliarmus] the disarming charm
    [rictusempra] send a jet of silver light to hit the enemy
    [tarantallegra] control the movement of one's legs
    [serpensortia] shoot a snake out of the end of one's wand
    [lumos] light the wand
    [obliviate] the memory charm
    [expecto patronum] send a Patronus to the dementors
    [accio] the summoning charm
    @END@
    4
    [lumos]
    the summoning charm
    [arha]
    take me to the sky
     
    Sample Output
    light the wand
    accio
    what?
    what?
    /*
      这个题用map会爆空间,用hash会碰撞,随意捡一个类似于编表的东西,
      字符串的hash值是点,字符串是边,查询的时候根据hash值遍历它的边 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #define M 100010
    #define mod 100007
    #define N 110
    #define hs 117
    using namespace std;
    struct node
    {
        char s1[22],s2[82];
        int pre;
    }A[M],B[M];
    int n,l,k,ha,cnt,heada[mod],headb[mod];
    char s[N],c,q1[N],q2[N],si[N];
    int Hash(char *a)//hash值 
    {
        int ret=1,l=strlen(a);
        for(int i=0;i<l;i++)
          ret=(ret*hs%mod+a[i])%mod;
        return ret%mod;
    }
    void Insert(char *a,char *b)//建边 
    {
        cnt++;
        strcpy(A[cnt].s1,a);
        strcpy(A[cnt].s2,b);
        ha=Hash(a);
        A[cnt].pre=heada[ha];
        heada[ha]=cnt;
        strcpy(B[cnt].s1,a);
        strcpy(B[cnt].s2,b);
        ha=Hash(b);
        B[cnt].pre=headb[ha];
        headb[ha]=cnt;
    }
    int find1(char *a)//找hash值对应的正确的边 
    {
        ha=Hash(a);
        for(int i=heada[ha];i;i=A[i].pre)
          if(!strcmp(A[i].s1,a))return i;
        return 0;
    }
    int find2(char *a)//找hash值对应的正确的边 
    {
        ha=Hash(a);
        for(int i=headb[ha];i;i=B[i].pre)
          if(!strcmp(B[i].s2,a))return i;
        return 0;
    }
    int main()
    {
        while(1)
          {
              memset(q1,0,sizeof(q1));
              memset(q2,0,sizeof(q2));
              gets(s);if(s[0]=='@')break;
              l=strlen(s);
              int l1=-1,l2=-1;
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='[')continue;
                    if(s[i]==']'){k=i+2;break;}
                    q1[++l1]=s[i];
              }
              for(int i=k;i<l;i++)q2[++l2]=s[i];
              Insert(q1,q2);
          }
        cin>>n;c=getchar();
        for(int i=1;i<=n;i++)
          {
              gets(s);l=strlen(s);int li=-1,flag=0;
              for(int i=0;i<l;i++)
                {
                    if(s[i]=='['){flag=1;continue;}
                    if(s[i]==']')break;
                    si[++li]=s[i];
              }
              if(flag)
              {
                  int r=find1(si);
                !r?cout<<"what?"<<endl:cout<<A[r].s2<<endl;
              }
            else 
              {
                  int r=find2(si);
                !r?cout<<"what?"<<endl:cout<<B[r].s1<<endl;
              }
          }
        return 0;
    }
    View Code
  • 相关阅读:
    深度优先搜索查找图中的所有连通分量
    广度优先搜索BFS-图
    深度优先搜索DFS-图
    稀疏向量算法
    zip函数
    函数(三)>>内置函数
    函数(二)
    面向对象1
    面向对象2
    函数(上)
  • 原文地址:https://www.cnblogs.com/harden/p/5751094.html
Copyright © 2011-2022 走看看