题目的意思是:给你几个字符串对str1,str2。输入完毕后有一个空行,然后是询问的输入,每行一个字符串,如果该字符串与str2相同,则输出str1,否则输出“eh”。
这题字符串对达到100000,询问的也达到了100000个,所以,普通的方法必定超时。所以需要建立字典树。
这题还有一个比较麻烦的就是输入。如何控制那一个空行之后的询问输入,这是关键。
简单的字典树的应用。
下面是AC的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class node
{
public:
node* ch[28];
char str[12];
node()
{
memset(ch, NULL, sizeof(ch));
memset(str, '\0', sizeof(str));
}
};
node *root;
void insert(char* str1, char* str2) //建树
{
int length = strlen(str1);
node *temp = root;
for(int i = 0; i < length; i++)
{
if(temp->ch[str1[i] - 'a'] == NULL) //该位置为空,new一个
{
temp->ch[str1[i] - 'a'] = new node();
temp = temp->ch[str1[i] - 'a'];
}
else //否则,等于它的后继
temp = temp->ch[str1[i] - 'a'];
if(i == length - 1) //到达字符串的结尾,将与之相关联的str赋值给叶子节点
strcpy(temp->str, str2);
}
}
void finds(char* str) //查找
{
int length = strlen(str);
node *temp = root;
for(int i = 0; i < length; i++)
{
if(temp->ch[str[i] - 'a'] != NULL)
{
temp = temp->ch[str[i] - 'a'];
}
else
{
cout << "eh" << endl;
return;
}
}
cout << temp->str << endl;
}
int main()
{
char str1[15], str2[15], str[30];
int i, j;
root = new node();
while(gets(str)) //输入的格式
{
if(strlen(str) == 0) //如果为空行,退出
break;
i = 0; j = 0;
while(str[i] != ' ')
str1[j++] = str[i++];
str1[j] = '\0'; i++;
j = 0;
while(str[i] != '\0')
str2[j++] = str[i++];
str2[j] = '\0';
insert(str2, str1);
}
while(cin >> str)
{
finds(str);
}
return 0;
}