hdu2846 Repository 字典树

//思路:使用字典树算法

//首先把每个单词按照其后缀子串放入到字典树,比如:abcd,我们应该吧abcd, bcd, cd, d都放入字典树中

//这里有个问题:同样一个字符串例如:abab,当查找ab时,就会重复计数,所以我们在建树的过程要多加一个标识符

//这个标识符表示该子串是不是重复出现在某一个字符串中,并且该字符串总是表示建树过程中最后一个字符串的编号

//如果插入的子串编号同当前的字符串编号不同,则计数+1,并且将当前节点的标识符设为要插入子串的编号

//否则不处理该子串

 

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

#define N 26

typedef struct Node_
{
	Node_()
	{
		id = 0;
		wordnum = 1;
		for (int i = 0;i < N;i++)
		{
			next[i] = 0;
		}
	}
	
	int id;
	int wordnum;
	struct Node_ * next[N];
}Node;

Node * root = 0;

int tree_insert(char * word, int id)
{
	if (root == 0)
	{
		root = new Node();
	}

	int len = strlen(word);
	Node * tmpNode = root;
	int site = 0;
	for (int i = 0;i < len;i++)
	{
		site = word[i] - 'a';
		if (tmpNode->next[site] == 0)
		{
			tmpNode->next[site] = new Node();
			tmpNode->next[site]->id = id;

		}
		else
		{
			if (tmpNode->next[site]->id != id)
			{
				tmpNode->next[site]->id = id;
				tmpNode->next[site]->wordnum++;
			}
		}
		tmpNode = tmpNode->next[site];
	}

	return 1;
}

int tree_search(char * index)
{
	Node * tmpNode = root;
	int len = strlen(index);
	int site = 0;
	for (int i = 0; i< len; i++)
	{
		site = index[i] - 'a';
		if (tmpNode->next[site] == 0)
		{
			printf("0\n");
			return 0;
		}
		tmpNode = tmpNode->next[site];
	}
	printf("%d\n", tmpNode->wordnum);
	return 0;

}


int main()
{
	int t, n, q, i, j, len;
	char tmpStr[N];
	scanf("%d", &n);
	for (i = 0;i < n;i++)
	{
		scanf("%s", tmpStr);
		len = strlen(tmpStr);
		for (j = 0;j < len;++j)
		{
			tree_insert(tmpStr + j, i);
		}
	}

	scanf("%d", &q);
	for(i = 0;i < q; i++)
	{
		scanf("%s", tmpStr);
		tree_search(tmpStr);
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值