传送门:http://poj.org/problem?id=2503
【分析】:题目意思是,把单词和其相对应的单词意思存入字典树,然后输入要查询的单词,输出它的意思。这里特别需要注意数据处理。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct node
{
int flag; //这个单词编号。
node *next[27];
node()
{
for (int i = 0; i < 27; i++)
next[i] = NULL;
flag = -1;
}
} ;
node *head = new node;
void insert(char *s, int m)
{
node *p = head;
int i, k, l = strlen(s);
for (i = 0; i < l; i++)
{
k = s[i] - 'a';
if (p->next[k] == NULL)
p->next[k] = new node;
p = p->next[k];
}
p->flag = m;
}
int find(char *s) //查找这个单词的意思
{
node *p = head;
int i, k, l = strlen(s);
for (i = 0; i < l; i++)
{
k = s[i] - 'a';
if (p->next[k] == NULL)
return -1; //找不到则返回-1;
p = p->next[k];
}
return p->flag; //找得到则返回这个单词的下标编号
}
char s1[110000][10 + 5], s2[110000][10 + 5], s[30];
//s1和s2数组中一维代表这个单词的数组编号下标,二维存入的就是单词了。
int main()
{
int i = 0, j, l, k; //i代表这个单词以及意思的数组下标
head = new node;
while (1)
{
gets(s);
if (s[0] == '\0')
break;
sscanf(s, "%s %s", s1[i], s2[i]); //sscanf用法,到空格时把字符串分为两个字符串分别存入S1,S2
insert(s2[i], i);
i++;
}
while (gets(s) != NULL)
{
if (s[0] == '\0')
break;
k = find(s);
if (k == -1) //找不到这个单词
printf("eh\n");
else
printf("%s\n", s1[k]);
}
return 0;
}