字典树(模板)

news/2025/2/27 13:25:12/文章来源:https://www.cnblogs.com/bakul/p/18739727

P8306 【模板】字典树

题目描述

给定 \(n\) 个模式串 \(s_1, s_2, \dots, s_n\)\(q\) 次询问,每次询问给定一个文本串 \(t_i\),请回答 \(s_1 \sim s_n\) 中有多少个字符串 \(s_j\) 满足 \(t_i\)\(s_j\)前缀

一个字符串 \(t\)\(s\) 的前缀当且仅当从 \(s\) 的末尾删去若干个(可以为 0 个)连续的字符后与 \(t\) 相同。

输入的字符串大小敏感。例如,字符串 Fusu 和字符串 fusu 不同。

输入格式

本题单测试点内有多组测试数据

输入的第一行是一个整数,表示数据组数 \(T\)

对于每组数据,格式如下:
第一行是两个整数,分别表示模式串的个数 \(n\) 和询问的个数 \(q\)
接下来 \(n\) 行,每行一个字符串,表示一个模式串。
接下来 \(q\) 行,每行一个字符串,表示一次询问。

输出格式

按照输入的顺序依次输出各测试数据的答案。
对于每次询问,输出一行一个整数表示答案。

输入输出样例 #1

输入 #1

3
3 3
fusufusu
fusu
anguei
fusu
anguei
kkksc
5 2
fusu
Fusu
AFakeFusu
afakefusu
fusuisnotfake
Fusu
fusu
1 1
998244353
9

输出 #1

2
1
0
1
2
1

说明/提示

数据规模与约定

对于全部的测试点,保证 \(1 \leq T, n, q\leq 10^5\),且输入字符串的总长度不超过 \(3 \times 10^6\)。输入的字符串只含大小写字母和数字,且不含空串。

说明

std 的 IO 使用的是关闭同步后的 cin/cout,本题不卡常。

分析

本题要求找到模式串中,测试串作为模式串的子串出现了多少次
改了半天 😦 ,字典树是一个树状字符数组,可以快速查找单词和子字符串,根节点是0,不包含字符,详细可以看字典树模板讲得很清楚

代码

#include<iostream>
#include<cstring>
#include<string>
#include<unordered_set>
#include<unordered_map>
using namespace std;const int N = 100010,M = 3e6 + 10;
int son[M][62],cnt[M],idx = 0;
char s[M];
inline int atn(char c) {               //分开映射到不同区间if(c >= 'a' && c <= 'z') return c - 'a';if(c >= 'A' && c <= 'Z') return c - 'A' + 26;return c - '0' + 52;}void insert(char str[])      //插入字符串
{int p = 0,len = strlen(str);  //p就是代表树的深度,for(int i = 0;i < len ;++i){int u = atn(str[i]);            if(!son[p][u]) son[p][u] = ++idx;   //如果在p深度下没有对应字符,那么创建新的字符分支,idx表示用到的字符个数p = son[p][u];                       //son[p][u]代表在p深度时候u字符存在cnt[p]++;                            //记录该位置字符出现次数,这里由于题目要求,不是记录的字符串末尾}}int query(char str[]) {           //查询字符串int p = 0,len = strlen(str);for(int i = 0;i < len ;++i) {    //int u = atn(str[i]);if(!son[p][u]) return 0;      //存在查询过程中的字符不存在就返回0p = son[p][u];                }return cnt[p];}int main() {ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T;cin >> T;while(T--) {// memset(son,0,sizeof(son));            //memset的时间是O(n),太大会超时,由于是全局变量,只用考虑改变过的部分// memset(cnt,0,sizeof(cnt));               //for(int i = 0;i <= idx; ++i)                //一共用了idx个位置for(int j = 0;j < 62; ++j)son[i][j] = 0;for(int i = 0;i <= idx; ++i) cnt[i] = 0;      //一样,idx = 0;                                    //使用过后清零,不然会一直叠加下去int n,q;cin >> n >> q;while(n--) { cin >> s; insert(s); }while(q--) {cin >> s;cout << query(s) << endl; }}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890602.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音爆火—可爱俏皮的软件卸载提示页面制作

前两天在抖音刷到了一个很可爱的软件卸载页面,鼠标滑动还会变脸,很萌很可爱,所以想着自己也做一个,花了一下午时间总算写了出来,总体效果还可以,哈哈抖音爆火—可爱俏皮的软件卸载提示页面制作前言 ​ 前两天在抖音刷到了一个很可爱的软件卸载页面,鼠标滑动还会变脸,很…

内部类--成员内部类、静态内部类、局部内部类--java进阶day03

1.内部类 内部类分为4种,成员内部类用处不大,静态内部类和局部内部类更是鸡肋,唯有匿名内部类是需要我们重点掌握的1.成员内部类Inter类要访问Outer类的成员可以直接访问,而Outer要访问Inter,就必须创建出Inter对象才可访问案例2.静态内部类3.局部内部类

逆向软件开发--学生管理系统

本次实验目的:训练逆向软件设计与开发能力。 实验内容:找一个已有的项目,阅读分析,找出软件尚存的缺陷,改进其软件做二次开发,并将过程整理成博客。 来源:CSDN上的学生管理系统 链接: https://blog.csdn.net/weixin_74362817/article/details/142308755fromshare=blogd…

对自己独立开发游戏的能力考察~来自入行4年的小菜鸟自查

一直想设计开发一款自己喜欢玩的游戏,加入各种自己想要的元素,但是总感觉自己技术积累不够,这次刚好有空,尝试写一下,看看自己在哪方面比较欠缺,这次主要是为了检测自己独立开发的能力,着重战斗方面的设计,ui是随便弄的,原谅原谅 首先是主场景大地图,实现了地图创建加…

掌握领域驱动微服务中的聚合与实体

—— 从遗留单体系统转型为现代分布式系统的实战经验照片由 Shamin Haky 提供,来自 Unsplash你好啊,我是一名经验丰富的软件工程师,专注于大规模应用的设计。多年来,我见过各种架构——从庞大的单体架构,到精细调整过的微服务基础设施。 有一个核心概念,一直帮助我保持系…

PyCharm安装插件时出现Error loading package list:Unexpected end of file from server

将Manage Repositories中无法用的源删掉即可 截图为只保留了一个可用的源

day02 ip地址和服务器

day02 服务器与机房 上节回顾运维是什么: 简单来说保证服务器的安全稳定的运行今日内容 服务器的基础的知识 ip地址的查看 windows查看IP的命令是 ipconfig关于局域网,NAT的概念公网,局域网的概念,以及路由器帮你做了网络地址的转换运维不象写代码,纯靠动脑,不断的写吗,…

至顶AI实验室DeepSeek完全实用手册V1.0 ——从技术原理到使用技巧

最近有很多小伙伴在问我们关于DeepSeek的原理、怎么部署、怎么用好各种五花八门的问题,于是至顶AI实验室整理了一份实用手册来一一解答。手册从发展脉络,到个人和企业使用部署方案,再到“DeepSeek+”使用技巧,对DeepSeek进行全方位解读,适合想用和用好DeepSeek的企业和个人…

第四章:简单逻辑门

简单逻辑门 复习第一章:需要一台计算机,在研究其组成的方向上进行努力 第二章:知道了计算机由输入设备、存储器、运算器和输出设备组成,这个体系目前还在沿用 第三章:了解了计算机使用二进制(0 和 1)表示所有数据TL;DR逻辑门是计算机处理二进制信号的基本单元 三个基础逻…

day02_ip地址和服务器

day02 服务器与机房 上节回顾运维是什么: 简单来说保证服务器的安全稳定的运行今日内容 服务器的基础的知识 ip地址的查看 windows查看IP的命令是 ipconfig关于局域网,NAT的概念公网,局域网的概念,以及路由器帮你做了网络地址的转换运维不象写代码,纯靠动脑,不断的写吗,…

中国国旗Python

import turtle 设置画布大小 turtle.setup(600, 400) 设置画笔速度 turtle.speed(10) 绘制红色背景 turtle.penup() turtle.goto(-300, 200) turtle.pendown() turtle.color("red") turtle.begin_fill() for _ in range(2): turtle.forward(600) turtle.right(90) tu…