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

hdoj-1247-Hat’s Words-字典树

时间:2015-04-18 08:52:58      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:单词查找

友情题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=30;
const int MAX=50005;
char  word[MAX][30];

struct node
{
	bool temp;
	node *next[N];
	node()
	{
		temp=false;
		memset(next,0,sizeof(next));
//next是表示每层有多少种类的数,如果只是小写字母,则26即可,   
//若改为大小写字母,则是52,若再加上数字,则是62了  		
	}
};

void insert(node *rt,char *s)
{
	int i,t;
	i=0;
	node *p=rt;
	while(s[i]) 
	{
		t=s[i++]-'a';
		if(p->next[t]==NULL)
			p->next[t]=new node();
		p=p->next[t];
	}
	p->temp=true;//指向单词尾部 
}

bool search(node *rt,char s[])
{
	int i,top;
	i=top=0;
	int stack[MAX];
	node *p=rt; 
	while(s[i]) 
	{
		int t=s[i++]-'a';
		
		if(p->next[t]==NULL)
		   return  false;
		p=p->next[t];
		if(p->temp&&s[i])  //找到含有子单词的分割点 并且该字符还没结束 
		   stack[top++]=i;  //将这个分割点入栈 ,然后循环判断剩下的部分是否含有一个子单词 
	}
	while(top)  //从这些分割点开始找 
	{
		bool ok=true;    //标记是否找到 
		i=stack[--top];  //第一个分割点 
		p=rt;
		while(s[i])
		{
			int t=s[i++]-'a';
			if(p->next[t]==NULL)
		    {
		    	ok=false;  //没有找到 
		    	break;
		    } 
			p=p->next[t];
		}
		if(ok&&p->temp)  
		  return true; 
		
	}
	return false;
}

int main() 
{
	int i=0;
	node *rt=new node();
	while(gets(word[i]))
	{
		insert(rt,word[i]);
		i++;
	} 
	for(int j=0;j<i;j++)
	{
		if(search(rt,word[j]))
		{
			cout<<word[j]<<endl; 
		}
	}
	return 0;
}


hdoj-1247-Hat’s Words-字典树

标签:单词查找

原文地址:http://blog.csdn.net/holyang_1013197377/article/details/45102055

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