字典树(模板)
P8306 【模板】字典树
题目描述
给定
一个字符串
输入的字符串大小敏感。例如,字符串 Fusu
和字符串 fusu
不同。
输入格式
本题单测试点内有多组测试数据。
输入的第一行是一个整数,表示数据组数
对于每组数据,格式如下:
第一行是两个整数,分别表示模式串的个数
接下来
接下来
输出格式
按照输入的顺序依次输出各测试数据的答案。
对于每次询问,输出一行一个整数表示答案。
输入输出样例 #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
说明/提示
数据规模与约定
对于全部的测试点,保证
说明
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; //存在查询过程中的字符不存在就返回0
p = 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!