HDU1251统计难题(字典树模板)

本文介绍了字典树(Trie树)的概念及其优势,并通过一个具体的编程实例演示了如何实现字典树的插入和查找操作。适用于搜索引擎系统中进行文本词频统计等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来百度百科对字典树的介绍:

       字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

字典树的根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。

字典树的应用有串的快速检索、串排序、串的最长公共前缀。

统计难题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251

字典树模板就能过的题,下面是AC代码

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;
/*num记录有几个单词通过当前结点
   mark标记是否为一个单词的结束位置*/
struct node{
	int num;
	node *son[26];
	bool mark;
};
node a[1000000];
int cnt = 0;
/*初始化结点结构体*/
void clearnode(node *p){
	p->num = 0;
	p->mark = false;
	for (int i = 0; i < 26; i++)p->son[i] = NULL;
}
/*插入函数*/
void insert(node *root, char *s){
	node *p = root;
	int len = strlen(s);
	for (int i = 0; i < len; i++){
		int id = s[i] - 'a';
		if (p->son[id] == NULL){      //找不到相应的字母结点时新建一个结点
			cnt++;
			clearnode(&a[cnt]);
			p->son[id] = &a[cnt];
		}
		p->son[id]->num++;
		p = p->son[id];
	}
	p->mark = true;
}
/*查找函数*/
int findstr(node *root, char *s){
	node *p = root;
	int len = strlen(s);
	for (int i = 0; i < len; i++){
		int id = s[i] - 'a';
		if (p->son[id] != NULL)
			p = p->son[id];
		else
			return 0;
	}
	return p->num;
}

int main()
{
	char s[12];
	clearnode(&a[0]);
	node * root = &a[0];
	while (gets(s) && s[0])
		insert(root, s);
	while (gets(s))
		cout << findstr(root, s) << endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值