您的位置:首页 > 其它

hdu 1075 (字典树映射)

2011-01-16 16:17 309 查看
/*
问题:输入一段英文,对照给的单词的映射,输出映射后的字符串

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: