首页 > 其他分享 >字典树(Trie)

字典树(Trie)

时间:2023-01-11 23:02:07浏览次数:50  
标签:字符 Trie int 字符串 节点 字典

字典树

Trie 树,即字典树,是一种树形结构。典型应用是用于统计和排序大量的字符串前缀来减少查询时间,最大限度地减少无谓的字符串比较。

Trie 树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

性质

  1. 字典树的根节点不代表任一个字符,其余所有节点都包含一个字符。

  2. 从字典树的根部开始走,路径上所有的字符 串起来就是当前节点所代表的字符串。

  3. 每一个节点的子节点所代表的字符各不相同。

就像这张图

字典树的操作

练习

模板题

本题的大意是给你一堆字符串,然后在问你里面有多少个串去掉后面数个字符后能与给你的字符串相同。
本题最简单的做法就是建一棵字典树,然后按找顺序查询给你的字符串,到了最后一个之后,当前点的子树大小就是答案。
代码实现

#include<bits/stdc++.h>
#define N 3000010
using namespace std;
int T,q,n,t[N][65],cnt[N],idx;
string s;
int getnum(char x)//转换字符 
{
	if(x>='A'&&x<='Z')
		return x-'A';
	else if(x>='a'&&x<='z')
		return x-'a'+26;
	else return x-'0'+52;
}
void add(string s1)
{
	int p=0,len=s1.size();
	for(int i=0;i<len;i++)
	{
		int c=getnum(s1[i]);
		if(!t[p][c])
			t[p][c]=++idx;
		p=t[p][c];
		cnt[p]++;
	}
}
int fid(string s1)
{
	int p=0,len=s1.size();
	for(int i=0;i<len;i++)
	{
		int c=getnum(s1[i]);
		if(!t[p][c])
			return 0;
		p=t[p][c];
	}
	return cnt[p];
}
void qk()
{
	for(int i=0;i<=idx;i++)
		for(int j=0;j<=122;j++)
			t[i][j]=0;
	for(int i=0;i<=idx;i++)
		cnt[i]=0;
	idx=0;
}
int main()
{
	cin>>T;
	while(T--)
	{
		qk();
		cin>>n>>q;
		for(int i=1;i<=n;i++)
		{
			cin>>s;
			add(s);
		}
		for(int i=1;i<=q;i++)
		{
			cin>>s;
			cout<<fid(s)<<endl;
		}
	}
	return 0;
}

标签:字符,Trie,int,字符串,节点,字典
From: https://www.cnblogs.com/Multitree/p/17045137.html

相关文章

  • E. Beautiful Subarrays(01字典树)
    Problem-E-Codeforces题意:给一个长度为n的数组a,问有多少个连续的子数组的异或和大于等于k思路:01字典树建立前缀异或和数组,题目变为有多少个$a_iˆa_j(1......
  • Trie树 (字典树)
    什么是trie树trie树是一种用来查找字符串的树形结构,利用字符串公共信息把多个字符串存储成一棵树,节约内存,加快检索速度这是一棵字典树trie树的性质1.根节点为空......
  • python列表里的字典元素去重
    去重:fromfunctoolsimportreduce#导入排序模块#列表里的字典元素去重复deflist_dict_duplicate_removal(data_list):run_function=lambdax,y:xifyi......
  • Trie树简单应用
    Trie树简单应用首先,Trie的思想很容易理解,一张图解释一切:也即:字符集有多大,则开多少倍空间。在实现上,我们用边来存储字符,然后开一个数组表示当前节点是否是一个字符串的......
  • 数据结构——字典树
    NO.1定义字典树又称单词查找树,\(Trie\)树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文......
  • jeecgBoot对象字典解析
    接口:interface CommonService声明:publicJSONObjectconvertObjDict(Objectobj,booleanisIgnore,String...columns);实现类:classCommonServiceImplimplements......
  • 元组和字典
    一.元组1.与列表类似,区别在于:①元组用小括号()定义,②元组的元素不能修改2.操作:①交换变量的值        ②元组的方法  .count()和.index()     ......
  • 日常开发记录-Object函数的内置方法Object.entries
     constdata={id:1,name:"张三",age:22}letparams=""/*Object.entries()方法返回一个数组,数组的每一个元素是对象的自有的可枚举属性的键......
  • 统计异或值在范围内的数对有多少(01字典树)
    1803.统计异或值在范围内的数对有多少-力扣(Leetcode)题意:   思路:很经典的方法,01字典树,同时在树上多维护一个数据,有多少个节点经过当前节点,记为cnt我们可以......
  • 字典树
    字典树概念又称单词查找树,Trie(读法类似try)树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于......