hdu 2846 Repository

字典树

将每个字符串的所有前缀插入进树,采用ID防止重复即可

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
string str;
int n;
int id;
struct stu
{
	int m;
	int id;
	stu* a[26];
	stu()
	{
		m=id=0;
		//memset(a,NULL,sizeof(a));
		for(int i=0;i<26;i++) a[i]=NULL;
	}
};
stu* p=new stu();
void build(stu *root,int cnt)
{
	int x=str[cnt]-'a';
	if(root->a[x]==NULL)
	{
		root->a[x]=new stu();
	}
	root=root->a[x];
	if(root->id!=id)
	{
		root->id=id;
		root->m++;
	}
	if(cnt==str.size()-1) return;
	else build(root,cnt+1);
}
int find(stu* root,int cnt)
{
	int x=str[cnt]-'a';
	root=root->a[x];
	if(root==NULL) return 0;
	if(cnt==str.size()-1) return root->m;
	else return find(root,cnt+1);
}
int main()
{
	cin.sync_with_stdio(false);
	cin>>n;
	while(n--)
	{
		id=n;
		cin>>str;
		for(int i=0;i<=str.size()-1;i++)
		{
			build(p,i);
		}
	}
	int m;
	cin>>m;
	while(m--)
	{
		cin>>str;
		cout<<find(p,0)<<endl;
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 03:40:02

hdu 2846 Repository的相关文章

hdu 2846 Repository 字典树

// hdu 2846 Repository 字典树 // // 题目大意: // // 有n个字符串,m个待询问的字符串,问这些字符串里面以该询问的 // 字符串为子串的字符串有多少个 // // 解题思路: // // 字典树,将字符串的所有子串插入到字典树中,并设立一个No.标识 // 以免重计数.最后查询就好了 // // 感悟: // // 这题的数据量有点大,虽然p是10000,但是长度是20,单个字符串的 // 最大子串数粗略的估计是 20 * 20 ,所以开的空间也要比较大.开始

HDU 2846 Repository(字典树,标记)

题目 字典树,注意初始化的位置~!!位置放错,永远也到不了终点了org.... 我是用数组模拟的字典树,这就要注意内存开多少了,,要开的不大不小刚刚好真的不容易啊.... 我用了val来标记是否是同一个串分解而来的,保存的是串的编号 num记录数目. //string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last); //把[first0,last0)之间的部分替换成[firs

HDU 2846 Repository(字典树变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 Problem Description When you go shopping, you can search in repository for avalible merchandises by the computers and internet. First you give the search system a name about something, then the syst

HDU 2846 Repository (字典树 后缀建树)

Repository Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2932    Accepted Submission(s): 1116 Problem Description When you go shopping, you can search in repository for avalible merchandises

HDU 2846 Repository(字典树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目:输入个n个词典串,然后输入q个串,对这q个串分别输出每个串都是几个词典串的子串. 思路:因为要包含子串,比如abd,将串abd,bd,d都插入字典树,然后每个节点下统计子树个数,直接查找前缀就可以了.但需要注意dcda这种的,需要插入dcda,cda,da,a,这个时候d下面的子树应该是一个而不是2个,因为dcda和da属于同一个词典串.所以在插入的时候进行处理即可. 代码 #inclu

HDU 2846 Repository (Trie&#183;统计子串)

题意  给你p个商品名称  然后输入q个字符串查询  对每个查询输出含有查询串为子串的商品个数 Trie能很快的求出字典中以某个串为前缀的串的个数    但现在要查的是以某个串为子串的串的个数  可以发现 一个串的任何子串肯定是这个串某个后缀的前缀  如"ri"是"Trie" 的子串  是后缀 "rie" 的前缀 那么我们在向Trie中插入时可以把这个串的所有后缀都插入 插入时要注意来自同一个串的后缀的相同前缀只能统计一次  如 "ab

hdu 2846 Repository 字典树的一种变形

Repository Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2633    Accepted Submission(s): 1028 Problem Description When you go shopping, you can search in repository for avalible merchandises

HDU 2846:Repository(Trie)

http://acm.hdu.edu.cn/showproblem.php?pid=2846 题意:给出N个模式串,再给出M个文本串,问每一个文本串在多少个模式串中出现. 思路:平时都是找前缀的,这里将模式串s[1……len]的每一个[i,len]的子串都插入,这样就可以满足条件.还要注意如果两个子串都为同一个模式串的子串,不能重复计数.可以用一个id数组装上一次是哪个串的id,如果id相同就不要重复计数了. 1 #include <cstdio> 2 #include <algorit

Repository HDU - 2846 (指针trie)

emm..就是多了一个id来标记是否是同一个单词的重复前缀 我是想用数组模拟的...runtime我有什么办法...emm... 人生几何... 难受... 就是不想用指针... 题意: 求含有某字符段的个数 解析: 把每个字符串遍历一遍 以每个元素为起点建树就好了.. 注意add型..因为每个字符串的元素只记一次  所以用id标记一下是否属于同一个源字符串就好了 嗯....还有...用c++交... #include <iostream> #include <cstdio> #i