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;

}

你可能感兴趣的:(HDU)