程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 1075 What Are You Talking About(字典樹)

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

編輯:C++入門知識

剛學的字典樹,代碼寫得很不熟練。寫法上也沒有什麼特別的優化,就是以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]='\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<ln;i++)
	{
		if(i==ln-1)
		{
			if(cur->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;
}

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved