您的位置:首页 > 其它

HDU-1075(字典树入门)

2012-08-09 10:25 295 查看
这道题目,我构思思路可是构思了好长时间....

主要是需要注意的点太多了,建树啊,查找啊什么的都好弄,就是,去字母的时候需要注意一些东西.比如,你遇到了标点就要停一下,,你遇到了空格回车也需要停一下,

反正是一定要考虑周全的.要不然出不了答案的.

贴出代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

struct T{
T *next[26];
int flag;
char trans[10];
}*root;

const int st='a';

void init(T *t)
{
memset(t->next,0,sizeof(t->next));
t->flag=0;
}

void Insert(char *eng,char *mars)
{
T *t,*newnode;
t=root;
int n=strlen(mars);
for(int i=0;i<n;i++)
{
if(t->next[mars[i]-st]==0)
{
newnode=new T;
init(newnode);
t->next[mars[i]-st]=newnode;
t=newnode;
}
else
{
t=t->next[mars[i]-st];
}
}
t->flag=1;
strcpy(t->trans,eng);
}

char * find(char *s)
{
T *t;
t=root;
int n=strlen(s);
for(int i=0;i<n;i++)
{
if(t->next[s[i]-st]==0)
return s;
else
{
t=t->next[s[i]-st];
}
}
if(t->flag==1)
return t->trans;
else
return s;
}

int main()
{
char t[10];
char eng[10],trans[10];
char *s;
char c;
char mars[10];
int m=0;
root=new T;
init(root);
scanf("%s",t);
if(strcmp(t,"START")==0)
{
while(scanf("%s",eng),strcmp(eng,"END"))
{

scanf("%s",trans);
Insert(eng,trans);
}
}
scanf("%s",t);
if(strcmp(t,"START")==0)
{
getchar();
while(c=getchar())
{
if('a'<=c&&c<='z'||'A'<=c&&c<='Z')
mars[m++]=c;
else if(c==' '||c=='\n')
{
mars[m]='\0';
if(strcmp(mars,"END")==0)
break;
s=find(mars);
printf("%s",s);
putchar(c);
m=0;
}
else
{
mars[m]='\0';
if(strcmp(mars,"END")==0)
break;
s=find(mars);
printf("%s",s);
putchar(c);
m=0;
}
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  insert ini c