hdu 1075 (字典树映射)

/*
	问题:输入一段英文,对照给的单词的映射,输出映射后的字符串
	
	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;
}
posted @ 2011-01-16 16:17  kfinder  阅读(1082)  评论(0编辑  收藏  举报