题意很简单,先给出一组相互映射的字符串组,左边的str1和右边的str2对应
接下来输入一行回车
接下来每输入字符串,判断之前是否输入过str2,如果没有则输出eh,否则输出str1
用了哈希表
直接给出代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#define prime 1999
using namespace std;
char answer[15];
typedef class HashTable
{
public:
char str1[15];
char str2[15];
HashTable *next;
HashTable()
{
next=0;
}
} HashTable;
HashTable *Hash[prime];
void Insert(int key,char str1[],char str2[])
{
if(!Hash[key])
{
HashTable *temp=new HashTable;
strcpy(temp->str1,str1);
strcpy(temp->str2,str2);
Hash[key]=temp;
}
else
{
HashTable *p=Hash[key];
while(p->next)
{
p=p->next;
}
HashTable *temp=new HashTable;
strcpy(temp->str1,str1);
strcpy(temp->str2,str2);
p->next=temp;
}
}
bool Find(int key,char str[])
{
if(!Hash[key])
{
return false;
}
HashTable *p=Hash[key];
while(p)
{
if(!strcmp(p->str2,str))
{
strcpy(answer,p->str1);
return true;
}
p=p->next;
}
return false;
}
int main()
{
int key;
char t;
char str1[15];
char str2[15];
memset(Hash,0,sizeof(Hash));
while(1)
{
t=getchar();
if(t=='\n')
break;
str1[0]=t;
int i=1;
while(1)
{
t=getchar();
if(t==' ')
{
str1[i]='\0';
break;
}
str1[i++]=t;
}
int j=1;
i=0;
key=0;
while(1)
{
t=getchar();
if(t=='\n')
{
str2[i]='\0';
Insert(key,str1,str2);
break;
}
key+=(t-96)*(j++);
str2[i++]=t;
}
}
char str[15];
while(cin>>str)
{
key=0;
int l=strlen(str);
for(int i=0; i<l; ++i)
{
key+=(str[i]-96)*(i+1);
}
if(!Find(key,str))
{
cout<<"eh"<<endl;
}
else
{
cout<<answer<<endl;
}
}
}