#include <stdio.h>
#include <cstring>struct Node
{
char *ch;
Node *next[26];
Node(){
ch = NULL;
memset(next, 0, sizeof(next));
}
};Node *root = new Node;
void Insert(char *s, char *t)
{
int len = strlen(t);
Node *p = root;
int id = 0;
for(int i = 0; i < len; i++)
{
id = t[i] - 'a';
if(p->next[id] == 0)
p->next[id] = new Node;
p = p->next[id];
}
p->ch = new char[15]; //将对应的英文单词存到火星文的叶子节点
strcpy(p->ch, s);
}void search(char *s, int len)
{
Node *p = root;
int id = 0, i;
for(i = 0; i < len; i++)
{
id = s[i] - 'a';
if(p->next[id] == 0) //为空,也就是查找失败
break;
p = p->next[id];
}
//一定要加上p->ch != NULL的条件判断,不然有可能输入火星单词的一部分,然后会输出null
if(i == len && p->ch != NULL)
printf("%s", p->ch);
else
printf("%s", s);
}int main()
{
char s[15], t[15]; //接收单词
char str[4000]; //接收句子
while(~scanf("%s", s))
{
if(!strcmp(s, "START"))
continue;
if(!strcmp(s, "END"))
break;
scanf("%s", t);
Insert(s, t);
}
getchar(); //吃掉换行符
while(gets(str))
{
if(!strcmp(str, "START"))
continue;
if(!strcmp(str, "END"))
break;
int i = 0;
while(str[i] != '\0')
{
if(str[i] >= 'a' && str[i] <= 'z')
{
int j = 0;
while(str[i] != '\0' && str[i] >= 'a' && str[i] <= 'z')
s[j++] = str[i++];
s[j] = '\0';
search(s, j);
}
else
printf("%c", str[i++]);
}
printf("\n");
}
return 0;
}
HDU-1075-What Are You Talking About(字典树/前缀树)(已AC,之前少了一个判断条件。。。)
最新推荐文章于 2019-01-14 12:14:06 发布