码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1247-Hat’s Words-字典树(Trie)

时间:2015-04-21 00:27:07      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:c   算法   c++      acm   

分析:字典树解决,注意节点里面只需要保存该点是否构成一个单词,和匹配类型的题有所区别;另外要注意重读打印。字典树效率高。


#include<iostream>
using namespace std;

struct Tri
{
	bool v;
	Tri* child[26];
};

Tri* root;

void Init()
{
	root->v=false;
	for(int i=0;i<26;i++)
	{
		root->child[i]=NULL;
	}
}

void CreateDic(char* str)
{
	Tri* p;
	int j;

	p=root;
	while(*str!=NULL)
	{
		if(p->child[*str-'a']==NULL)
		{
			p->child[*str-'a']=(Tri*)new Tri;
			p->child[*str-'a']->v=false;
			for(j=0;j<26;j++)
				p->child[*str-'a']->child[j]=NULL;
		}
		p=p->child[*str-'a'];
		str++;
	}
	p->v=true;
}

bool Find(char* str)
{
	Tri* p=root;

	while(*str!=NULL)
	{
		if(p->child[*str-'a']==NULL)
			return 0;
		p=p->child[*str-'a'];
		str++;
	}
	return p->v;
}

void Del(Tri* p)
{
	for(int i=0;i<26;i++)
		if(p->child[i])
			Del(p->child[i]);
	Del(p);
	
}

char total[50002][100];
int main()
{
	char a[100],b[100],c[100];
	int i=0,j,k;

	root=(Tri*)new Tri;
	Init();
	while(gets(a))
	{
		CreateDic(a);
		strcpy(total[i++],a);
	}

	for(j=0;j<i;j++)
	{
		for(k=1;k<strlen(total[j]);k++)
		{
			strncpy(b,total[j],k);
			b[k]='\0';
			strcpy(c,total[j]+k);
				
			if(Find(b)&&Find(c))
			{
				cout<<total[j]<<endl;
				break;                      //注意查找成功后,一定要跳出循环,否则会重复输出
			}
		}
	}
    return 0;
}


HDU ACM 1247-Hat’s Words-字典树(Trie)

标签:c   算法   c++      acm   

原文地址:http://blog.csdn.net/a809146548/article/details/45157539

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!