首页 > 其他分享 >Trie树,字典树

Trie树,字典树

时间:2024-08-17 16:27:45浏览次数:5  
标签:cnt idx Trie ++ son int define 字典

题目链接

字典树的介绍

字典树也叫(Trie树),字典树有插入和查询两个操作,我们先假设我们已经插入了单词 befakebeefface 这几个单词,那么我们可以建树。

image

当我们查询 befafAKefac 时,答案分别为:\(2,2,0,1\)。

字典树的插入

我们可以给树上的每个节点标号,比如上面的树,可标为:

image

根节点永远都是 \(0\),而其他节点,按访问顺序来标号。

我们定义 son[i][w] 表示现在的编号 i 的下一个字符是 w 的编号是多少,比如,编号 i 所对应的字符串是 t[i] 那么 t[son[i][w]]=t[i]+w

设一个变量 p,表示现在访问到的节点编号是多少,一开始的时候 p=0,然后如果 son[p][w]=0 那么就新建一个节点编号,即 son[p][w]=++idx。接着 \(p\) 赋值成下一个节点的编号即 son[p][w],然后对应字符串出现次数 cnt[p] 加一。

代码:

int idx=0;
void insert(char *s){
    int p=0;
    for(int i=0,w;w=s[i];i++){
        if(!son[p][w])son[p][w]=++idx;
        p=son[p][w];
        cnt[p]++;
    }
}

字典树的查询

首先还是设一个变量 p 表示现在访问到的节点编号是多少,p 一开始在根节点,然后如果 son[p][w]=0 那么就表示没有这种字符串,即返回 \(0\),否则的话,我们继续访问,最后我们枚举完整个字符串,即查询到 s 字符串对应的编号 p,返回 cnt[p] 即可。

int query(char *s){
    int p=0;
    for(int i=0,w;w=s[i];i++){
        if(!son[p][w])return 0;
        p=son[p][w];
    }
    return cnt[p];
}

模板代码

题目链接

就是普通的模板,卡常卡过就行了。

#include<bits/stdc++.h>
#define fast ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define rep(l,r,i) for(int i=l,END##i=r;i<=END##i;i++)
#define per(r,l,i) for(int i=r,END##i=l;i>=END##i;i--)
#define endl '\n'
#define pb push_back
#define mk make_pair
#define pii pair<int,int>
#define vi vector<int>
using ll=long long;
using ull=unsigned long long;
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=3e6+10,MAXM=1e5+10;
int T,n,q,cnt[MAXN],idx;
char s[MAXM];
map<char,int>son[MAXN];
void insert(char *s){
    int p=0;
    for(int i=0,w;w=s[i];i++){
        if(!son[p][w]){
            son[p][w]=++idx;
            cnt[idx]=0;
        }
        p=son[p][w];
        cnt[p]++;
    }
}
int query(char *s){
    int p=0;
    for(int i=0,w;w=s[i];i++){
        if(!son[p][w])return 0;
        p=son[p][w];
    }
    return cnt[p];
}
void solve(){
    rep(0,idx,i)son[i].clear();
    idx=0;
    scanf("%d%d",&n,&q);
    rep(1,n,i){
        scanf("%s",s);
        insert(s);
    }
    while(q--){
        scanf("%s",s);
        printf("%d\n",query(s));
    }
}
int main(){
    cin>>T;
    while(T--)
        solve();
    return 0;
}

标签:cnt,idx,Trie,++,son,int,define,字典
From: https://www.cnblogs.com/TLSnail/p/18364586

相关文章

  • C# Datetime retrieve microsecond
    From.net8.0thecanretrieveDateTime.Now.MicroSeconddirectly,butwhenyouusetheclassic.netframeworkitdoesnotworkatall.I'llshowaroundviaTicksofDateTime,tocompareandvalidatemyassumptionidevelopedin.net8staticvoidMai......
  • 『dsu、Trie』Day7
    StampRallykruskal重构树板子,套上二分求一下祖先即可。AND-MEXWalk注意到答案只可能是0,1,2。因为1和2显然不能同时存在。证明:可知边权序列不增,如果前面出现2则说明第1位是0,由于是与运算所以不可能有1了。判断0和1即可。0好判断,只要全不为0,也就是最后......
  • C#基础:JSON和字符串、字典、实体类的相互转化方案
    备注:可直接在控制台输出,不需要引用第三方nuget包usingSystem;usingSystem.Collections.Generic;usingSystem.Text.Encodings.Web;usingSystem.Text.Json;classProgram{publicclassData{publicstringMoCategorySelect{get;set;}......
  • has|have tried (SAMPLE)500
    has|havetried@@to:@@410@@have:@@402@@the:@@218@@has:@@144@@i:@@141@@and:@@127@@of:@@81@@that:@@72@@in:@@60@@a:@@57@@#:@@49@@":@@46@@you:@@41@@it:@@41@@we:@@38@@he:@@36@@for:@@36@@with:@@33@@they:@@32@@this:@@31@@but:@@30would:......
  • InnoDB-数据字典
    Version:8.0.32INFORMATION_SCHEMA压缩INNODB_CMP和INNODB_CMP_RESET提供有关压缩操作的数量和执行压缩所花费的时间的信息。INNODB_CMPMEM和INNODB_CMPMEM_RESET提供有关内存分配用于压缩的方式的信息。事务和锁INNODB_TRX:这个INFORMATION_SCHEMA表提供了当前在InnoD......
  • Python字典用于测验的常见问题及解决方法
    在使用Python字典进行测验或测试时,可能会遇到一些常见的问题。以下是这些问题的描述及相应的解决方法:1、问题背景在Python中,我们经常会使用字典结构来创建测验程序,其中键是问题,值是答案。当用户回答问题时,程序会检查答案是否正确,并给出相应的反馈。然而,在使用字典结构......
  • Python字典的高级用法
    一、collections中defaultdict的使用1.字典的键映射多个值将下面的列表转成字典l=[('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]一个字典就是一个键对应一个单值的映射,而上面的列表中有相同键。如果你想要一个键映射多个值,那么就需要将这多个值放到另外......
  • trie算法
    1、定义高效的存储和查找字符串集合的数据结构它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高2、构建我们可以使用数组来模拟实现Trie树。我们设计一个二维数组son[N][26]来模拟整个树的结构,而cnt[N]来记录单词个......
  • 如何快速从文本中找到需要的信息,字典和正则灵活运用
    importre#打开文本文件f=open("stock_data.txt",encoding="utf-8")#单独读取第一行数据处理进行分割,末尾换行符去掉headers=f.readline().strip().split(',')print(headers)#定义一个字典,以股标代码做为KEY,每个行做为值stock_list={}forlineinf:line......
  • Got an error when I tried to use the Openai SDK in Node.js
    题意:尝试在Node.js中使用OpenAISDK时遇到错误问题背景:IamtryingtouseOpenaiapiwithnodejs,IfollowthetutorialandwanttoaddasimplegpttextcompletionfeautureusingtheopenaiSDK,butIgotanerrorsays:/node_modules/openai/core.js:44con......