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

2014-11-23 23:11:59 · 作者: · 浏览: 4
刚学的字典树,代码写得很不熟练。写法上也没有什么特别的优化,就是以1A为第一目标!
可惜还是失败了。
少考虑了一种情况,就是一个单词是另一个单词前缀的问题,写了好久,还是没有1A。不过感觉对字典树有了更深刻的理解。
代码写得不好,看看别人都是怎么写字典树的去。
#include
#include
#include
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;ia[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]='\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]='\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
a[ss[i]-'a']!=NULL&&cur->a[ss[i]-'a']->s[0]!='\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]!='\0';i++) { if(s[i]>='a'&&s[i]<='z') { ss[k++]=s[i]; continue; } else if(k!=0) { ss[k]='\0'; if(!FindTree()) printf("%s",ss); memset(ss,0,sizeof(ss)); k=0; } printf("%c",s[i]); } if(k!=0) { ss[k]='\0'; if(!FindTree()) printf("%s",ss); } printf("\n"); } return 0; }