九度OJ 题目1029:魔咒词典

来源:互联网 发布:移民 知乎 编辑:程序博客网 时间:2024/04/30 18:58
题目1029:魔咒词典

时间限制:5 秒

内存限制:32 兆

特殊判题:

提交:1956

解决:542

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

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

    首先列出词典中不超过100000条不同的魔咒词条,每条格式为:

    [魔咒] 对应功能

    其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
    词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。

输出:
    每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”
样例输入:
[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
样例输出:
light the wandacciowhat?what?
来源:
2008年浙江大学计算机及软件工程研究生机试真题
/**********************************   日期:2013-2-18*   作者:SJF0115*   题号: 九度OJ 题目1029:魔咒词典*   来源:http://ac.jobdu.com/problem.php?pid=1029*   结果:AC*   来源:2008年浙江大学计算机及软件工程研究生机试真题*   总结:**********************************/#include<map>#include<string>#include<iostream>#include<string.h>#include <stdio.h>using namespace std; map<string,string> Map;int Function(string str){     int len=str.length(); int i;     for(i = 0;i < len;i++) { if(str[i]==']')  { break; } } //魔咒     string s1 = str.substr(0,i+1); //对应功能     string s2 = str.substr(i+2,len-i-2); //存储在Map中     Map[s1] = s2;     Map[s2] = s1; return 0;} int main(){    char s[105];int n,i;    string str;//输入数据    while(gets(s)){        str = s;        if(str == "@END@") {break;}//分割魔咒及其对应功能        Function(str);    }    scanf("%d\n",&n);    for(i = 0;i < n;i++){        gets(s);str = s;//寻找魔咒或者对应功能        if(Map.find(str) == Map.end()){printf("what?\n");}        else{           str = Map[str];   //输出对应的功能           if(str[0] != '[')   {   cout<<str<<endl;   }   //输出对应的魔咒           else   {   cout<<str.substr(1,str.length()-2)<<endl;   }        }    }//forreturn 0;}
转载
#include <stdio.h>#include <string.h>#include <stdlib.h> struct dic{  char wo[22];  char ex[82];}a[10000],b[10000]; int cmp1(const void *a,const void *b){ return strcmp((*(struct dic *)a).wo,(*(struct dic *)b).wo);} int cmp2(const void *a,const void *b){ return strcmp((*(struct dic *)a).ex,(*(struct dic *)b).ex);} int main(){  int i,k;  int n,high,low,mid,tmp,ans;  char s[104],c[82];  k=0;    while(gets(s)&&strcmp(s,"@END@"))    {      int j=0;      i=1;      while(s[i]!=']')      {        a[k].wo[j]=s[i];        b[k].wo[j]=s[i];        j++;        i++;      }        a[k].wo[j+1]='\0';        b[k].wo[j+1]='\0';       if(s[i]==']') i+=2;       j=0;      while(s[i]!='\0')      {        a[k].ex[j]=s[i];        b[k].ex[j]=s[i];        j++;        i++;      }      a[k].ex[j+1]='\0';      b[k].ex[j+1]='\0';      k++;    }    qsort(a,k,sizeof(a[0]),cmp1);    qsort(b,k,sizeof(b[0]),cmp2);    scanf("%d",&n);    getchar();    while(n--)    {     gets(c);     ans=-1;     low=0;high=k-1;     if(c[0]=='[')     {         int len;         len=strlen(c);         for(i=0;i<len-2;i++)          c[i]=c[i+1];         c[i]='\0';         while(low<=high)        {          mid=(low+high)/2;          tmp=strcmp(c,a[mid].wo);          if (tmp==0) {ans=mid;break;}            else if(tmp>0) low=mid+1;              else high=mid-1;        }        if(ans==-1) printf("what?\n");          else printf("%s\n",a[ans].ex);     }     else     {          while(low<=high)        {          mid=(low+high)/2;          tmp=strcmp(c,b[mid].ex);          if (tmp==0) {ans=mid;break;}            else if(tmp>0) low=mid+1;              else high=mid-1;        }        if(ans==-1) printf("what?\n");          else printf("%s\n",b[ans].wo);     }     }return 0;} 

Runtime Error   拜求大牛????????????
#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct Str{char name[22];//魔咒char function[82];//对应功能}Str;Str str[10001];int main() {int n,i,j,index = 0,flag,start,k;char s[104];//char command[104];    while (gets(s)){//词典最后一行以“@END@”结束,这一行不属于词典中的词条if(s[0] == '@'){break;}else{//输入魔咒for(i = 0;s[i] != ']';i++){str[index].name[i] = s[i];}str[index].name[i++] = ']';str[index].name[i] = '\0';//输入对应功能start = i+1;for(i = start,k = 0;s[i] != '\n';k++,i++){str[index].function[k] = s[i];}str[index].function[k] = '\0';}index++;    }//whilescanf("%d\n",&n);for(i = 0;i < n;i++){gets(s);flag = 0;//输入的是魔咒输出对应功能if(s[0] == '['){for(j = 0;j < index;j++){//找到魔咒对应的功能if(strcmp(s,str[j].name) == 0){flag = 1;//输出对应的功能printf("%s\n",str[j].function);break;}}}//输入的是魔咒的功能输出魔咒else{for(j = 0;j < index;j++){//找到对应的魔咒if(strcmp(s,str[j].function) == 0){flag = 1;//输出对应的魔咒for(k = 1;str[j].name[k] != ']';k++){printf("%c",str[j].name[k]);}printf("\n");break;}}}//没有找到if(flag == 0){printf("what?\n");}}    return 0;}


原创粉丝点击