首页 > 其他分享 >字典树模板

字典树模板

时间:2023-02-14 13:35:22浏览次数:43  
标签:sz ch val int len ++ 模板 字典

字典树数组模拟版: 

#include <cstdio>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1000010;
const int SIZE = 26;

int ch[N][SIZE]; 
int val[N],sz;
int ans;

void init()  // 初始化
{
    sz = 1; // 标号
    memset(ch,0,sizeof(ch)); 
    memset(val,0,sizeof(val));
}
// 字典树中,对于每一个串在放进到树上时,当前串中的每一个字符都有一个编号,对于字符来说是存放到边上的。
// 所有的串的根都是一个空的,并且都是同一个
// 对于 val[N] 数组来说,是用来统计当前前缀的个数。‘
// 这里 val[u]++ 为什么会不造成覆盖问题?比如 abc 和 dbc,前缀不相同,但是在保存 val 时,都是第二个,但是这里是保存在不同的 u 里面的
// 因为 ch[u][c] = sz ++ ,标号发生了变化, 然后 u = ch[u][c]; val[u] ++; 这样就保证了统计的是不同的前缀的都放到了不同的 val 里面
void creat(char *s) // 插入单个字符
{
    int u = 0, len = strlen(s); 
    for(int i = 0; i < len; i ++)
    {
        int c = s[i] - 'a'; 
        if(!ch[u][c]) ch[u][c] = sz++;  
        u = ch[u][c];
        val[u] ++;
    }
}
// 查询前缀个数
// 查询过程中,如果 ch[u][c] == 0 ,表示没有
// 否则继续沿树向下走
int query(char *s)
{
    int u = 0, len = strlen(s);
    for(int i = 0; i < len; i ++)
    {
        int c = s[i] - 'a';
        if(!ch[u][c]) return 0;
        u = ch[u][c];
    }
    return val[u];
}
char s[100005];
int main()
{
    int n,q;
    while(~scanf("%d %d", &n, &q))
    {
        init();
        for(int i = 0; i < n ; i ++)
        {
            getchar();
            scanf("%s", s);
            creat(s);
        }
        while(q--)
        {
            getchar();
            scanf("%s", s);
            printf("%d\n",query(s));
        }
    }
    return 0;
}

 

 

标签:sz,ch,val,int,len,++,模板,字典
From: https://blog.51cto.com/u_15965659/6056716

相关文章

  • Dumb feature Gym - 102020D 【 字典树 】
    D-Dumbfeature Gym-102020D  &:字典树的模板题,根据来的串建树,再查询。不过当时没弄出来,要映射一下子,把字母映射成键盘上的数字。ps:这题的数据应该是有问题,只......
  • 7-10 公路村村通 (30 分)【最小生成树 模板】
    7-10 公路村村通 (30分)现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入格式:输入数据......
  • 从 s 点到 t 点的最短路(简单模板)(迪杰斯特拉)
    迪杰斯特拉简单版#include<bits/stdc++.h>usingnamespacestd;intm,n;constintinf=0x3f3f3f3f;intdis[1005];intgra[405][405];intvis[1005];voidd......
  • vue原理:diff、模板编译、渲染过程等
    一、虚拟DOM:因为DOM操作非常消耗性能,在操作DOM时,会出现DOM的回流(Reflow:元素大小或者位置发生改变)与重绘(元素样式的改变)使DOM重新渲染。现在的框架Vue和React很少直接操作......
  • TreeMap是按照key的字典顺序来排序
    一、TreeMapTreeMap默认排序规则:按照key的字典顺序来排序(升序)字典排序(lexicographicalorder)是一种对于随机变量形成序列的排序方法。即按照字母顺序,或者数字小大顺序,由小......
  • vue原理:diff、模板编译、渲染过程等
    一、虚拟DOM:因为DOM操作非常消耗性能,在操作DOM时,会出现DOM的回流(Reflow:元素大小或者位置发生改变)与重绘(元素样式的改变)使DOM重新渲染。现在的框架Vue和React很少直接操作......
  • Mybatis05 - 将有固定格式的文件添加至IDEA模板
    将常用的固定格式的配置文件添加为IDEA中的模板Mybatis核心配置文件mybatis-config.xmlMybatis映射文件mybatis-mapper.xml可以在新建文件时直接使用添加的模板红......
  • 最长公共子序列(模板 LCSL)
    博客: https://www.cnblogs.com/sasuke-/p/5396843.html模板#include<iostream>#include<cstdio>#include<cstring>#defineMAXN1010usingnamespacestd;intc[MAXN][M......
  • 对json中的字典提取其中的所有参数(包括list和dict中)整合为一层
    例如:在python中,我有一个字典,类似于{s1:[{s11:0,s12:2},{s13:3,s14:4}],s2:'s2',s3:{s31:0,s32:2}},我想使用递归提取其中所有的字典的key值和value,并在key值中包含它在字典......
  • hamilton路径-图论算法模板
    什么是哈密尔顿路径哈密顿图(哈密尔顿图)(英语:Hamiltoniangraph,或Traceablegraph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过......