(字典树Trie Tree)HDU 1251 统计难题

//Trie Tree 一般只需要查询和插入操作即可
#include<stdio.h>
#include<string.h>
#include <iostream>
using namespace std; 
typedef struct Trie_node
{
	int count;//单词计数
	struct Trie_node* next[26];//下个指针节点
	bool exist;//标记整个单词是否结束
}TrieNode, *Trie;

Trie_node * createTrieNode() //初始化字典树根节点
{
	TrieNode* node = (TrieNode *)malloc(sizeof(TrieNode));
	node->count=0;
	node->exist = false;
	memset(node->next,0,sizeof(node->next));//初始化空指针
	return node;
};

void Trie_insert(Trie root, char * word) // 插入单词
{
	Trie node = root;//根节点
	char *p = word;
	while (*p)
	{
		if (node->next[*p - 'a'] == NULL)//如果节点为空
		{
			node->next[*p - 'a'] = createTrieNode();//那么创建节点
		}
		node = node->next[*p - 'a'];//指针传递
		++p;//字符后移
		node->count += 1;//单词前缀出现次数或(单词出现次数)
	}
	node->exist = true;//插入单词完成
}

int Trie_search(Trie root, char *word)//搜索字符串
{
	Trie node = root;
	char *p = word;
	while (*p)
	{
		node = node->next[*p - 'a'];
		++p;
		if (node == NULL)
		return 0;
	}
	return node->count;
}

int main()
{
	Trie root = createTrieNode();
	char str[15];
	bool flag = false;
	while (gets(str))
	{
		if (flag)
			printf("%d\n", Trie_search(root, str));
		else
		{
			if (strlen(str)!= 0)
			{
				Trie_insert(root, str);
			}
			else
			{
				flag = true;
			}
		}
	}
	return 0;
}

发布了34 篇原创文章 · 获赞 109 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/huihui1094667985/article/details/70236488