hdu 1075 What Are You Talking About(字典树)

刚学的字典树,代码写得很不熟练。写法上也没有什么特别的优化,就是以1A为第一目标!

可惜还是失败了。

少考虑了一种情况,就是一个单词是另一个单词前缀的问题,写了好久,还是没有1A。不过感觉对字典树有了更深刻的理解。

代码写得不好,看看别人都是怎么写字典树的去。

#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct node
{
	node *a[27];
	char s[15];
};
char s1[15],s2[15];
char s[3005],ss[15];
int k;
node *root;
void InsertTree()
{
	node *cur;
	node *s;
	int i,ln;
	ln=strlen(s2);
	cur=root;
	for(i=0;i<ln;i++)
	{
		if(i==ln-1)
		{
			if(cur->a[s2[i]-'a']!=NULL)
			{
				strcpy(cur->a[s2[i]-'a']->s,s1);
				return ;
			}
			else
			{
				s=(node *)malloc(sizeof(node));
				memset(s->a,0,sizeof(s->a));
				s->s[0]='';
				cur->a[s2[i]-'a']=s;
				strcpy(s->s,s1);
			}
		}
		else if(cur->a[s2[i]-'a']!=NULL)
			cur=cur->a[s2[i]-'a'];
		else
		{
			s=(node *)malloc(sizeof(node));
			memset(s->a,0,sizeof(s->a));
			s->s[0]='';
			cur->a[s2[i]-'a']=s;
			cur=s;
		}
	}
	return ;
}
int FindTree()
{
	int i,ln;
	node *cur;
	cur=root;
	ln=strlen(ss);
	for(i=0;i<ln;i++)
	{
		if(i==ln-1)
		{
			if(cur->a[ss[i]-'a']!=NULL&&cur->a[ss[i]-'a']->s[0]!='')
			{
				printf("%s",cur->a[ss[i]-'a']->s);
				return 1;
			}
			else
				return 0;
		}
		else
		{
			if(cur->a[ss[i]-'a']!=NULL)
				cur=cur->a[ss[i]-'a'];
			else
				return 0;
		}
	}
	return 0;
}
int main()
{
	root=(node *)malloc(sizeof(node));
	memset(root->a,0,sizeof(root->a));
	while(scanf("%s",s1))
	{
		if(strcmp(s1,"START")==0)
			continue;
		else if(strcmp(s1,"END")==0)
			break;
		scanf("%s",s2);
		InsertTree();
	}
	getchar();
	while(gets(s))
	{
		if(strcmp(s,"START")==0)
			continue;
		else if(strcmp(s,"END")==0)
			break;
		int i;
		k=0;
		for(i=0;s[i]!='';i++)
		{
			if(s[i]>='a'&&s[i]<='z')
			{
				ss[k++]=s[i];
				continue;
			}
			else if(k!=0)
			{
				ss[k]='';
				if(!FindTree())
					printf("%s",ss);
				memset(ss,0,sizeof(ss));
				k=0;
			}
			printf("%c",s[i]);
		}
		if(k!=0)
		{
			ss[k]='';
			if(!FindTree())
				printf("%s",ss);
		}
		printf("
");
	}	
	return 0;
}


原文地址:https://www.cnblogs.com/dyllove98/p/3199002.html