hdu1251

并查集告一段落啦,先放下吧,今晚再做一下总结吧

之后转入字典树的学习

这道题目是比较基础的而且明显的字典树

慢慢来吧

题意比较明显,查找以某一个串为前缀的单词的数目,字典树还有一个名称,就是前缀树,所以就很明显了吧

不过下面的代码用的是比较朴素的方法,root->next[],开的内存太大了,不过速度也相对快了

root->cnt记录的是以从根节点到达该节点组成的串为前缀的单词的个数

此题涉及到字典树的俩个基本操作,插入还有查找,代码很容易理解

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
	int cnt;
	struct node *next[26];
}*tree,t;
tree root;
void insert(char *str)
{
	tree p=root,newnode;
	for(;*str!='\0';str++)
	{
		if(p->next[*str-'a']!=NULL)
		{
			p=p->next[*str-'a'];
			p->cnt++;
		}
		else 
		{
			newnode=(tree)malloc(sizeof(t));
		  for(int i=0;i<26;i++)
		    newnode->next[i]=NULL;
	      newnode->cnt=1;
		  p->next[*str-'a']=newnode;
		  p=newnode;
		}
	}
}
int find(char *str)
{
	tree p=root;
	for(;*str!='\0';str++)
	{
		if(p->next[*str-'a']!=NULL)
		p=p->next[*str-'a'];
		else return 0;
	}
	return p->cnt;
}
int main()
{
	char str[16];
	root=(tree)malloc(sizeof(t));
	for(int i=0;i<26;i++)
		root->next[i]=NULL;
	root->cnt=0;//根节点初始化当然为0,不包含任何字母
	while(gets(str))
	{
		if(strcmp(str,"")==0)
			break;
		insert(str);
	}
	while(gets(str))
	{
		//if(strcmp(str,"")==0)
			//break;
		printf("%d\n",find(str));
	}
	return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2044316.html