/*
问题:输入一段英文,对照给的单词的映射,输出映射后的字符串
YY :典型的字典树问题,先处理好映射表,在一映射单词结尾处记录与之对应的单词,
后面字符串处理一下,单个单词进行查,找到后输出,没有输出原始词
刚开始交RE越界,不解,觉得是指针问题,但找不出错处
后来找到个神奇数据后改过就A了
/*
START
dog aa
END
START
a aa
END
*/
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node
{
struct node *child[26];
char *str;
};
struct node *root = new struct node;
void Init()
{
for(int i =0;i <26; i++)
root->child[i] = 0;
}
void Insert(char *c1,char *c2)
{
int len = strlen(c2);
struct node *cur;
cur = root;
for(int i =0;i <len;i ++){
if(cur ->child[c2[i] - 'a'] != 0){
cur = cur ->child[c2[i] - 'a'];
}
else{
struct node *newnode = new struct node;
cur ->child[c2[i] - 'a'] = newnode;
for(int j =0; j <26; j++){
newnode ->child[j] = 0;
}
newnode ->str = NULL; //相当重要啊!!!!!
cur = newnode;
}
}
cur->str = (char *)malloc(15 * sizeof(char));
strcpy(cur->str, c1);
}
void Print(char *c2)
{
int len = strlen(c2);
struct node *cur;
cur = root;
if(!len) return ;
for(int i =0;i <len; i++){
if(c2[i] < 'a' || c2[i] > 'z' || cur ->child[c2[i] - 'a'] == 0){
printf("%s",c2);
return ;
}
else{
cur = cur ->child[c2[i] - 'a'];
}
}
if(cur ->str != NULL)
printf("%s",cur ->str);
else
printf("%s",c2);
}
int main()
{
char s[15],temp[3005],c1[15],c2[15];
Init();
scanf("%s", temp);
while(scanf("%s", c1) && strcmp(c1, "END")!=0){
scanf("%s", c2);
Insert( c1, c2);
}
scanf("%s", temp);
getchar();
while(gets(temp) && strcmp(temp,"END")!=0)
{
int len = strlen(temp);
int start = -1, end = 0;
int num = 0;
for(int i =0; i<len; i++){
if(temp[i] >= 'a' && temp[i] <= 'z'){
if(start == -1){
start = i;
}
s[num++] = temp[i];
}
else{
if(start > -1){
start = -1;
s[num] = '\0';
num = 0;
Print(s);
}
printf("%c", temp[i]);
}
}
if(start > -1) ////***********在此,我不给力!!!!********************
{
s[num] = '\0';
Print(s);
if(temp[len - 1] < 'a' || temp[len - 1] > 'z')
printf("%c", temp[len - 1]);
}
printf("\n");
}
return 0;
}