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

P8306 【模板】字典树

时间:2024-01-29 14:11:42浏览次数:27  
标签:P8306 string int 字符串 模板 字典

P8306 【模板】字典树

字典树树简介

字典树英文名为 \(Trie\) 树,就是像字典一样的树。

字典树树正文

我们建一棵树,边表示字母和数字,节点表示根到此节点的字符串,假设有某个点,其子节点表示在这个字符串上再加一个字母的字符串。

那么这样如何解决这道题呢?

首先我们要根据题目给定的字符串建立这棵字典树:

void push_in(string & s){
	int now=0;
	for(int i=0;i<s.size();i++){
		cnt[now]++;
		int t=getid(s[i]);
		if(nxt[now][t]==-1) {
			nxt[now][t]=++all;
		}
		now=nxt[now][t];
	}
	cnt[now]++;
}
for(int i=1;i<=n;i++)push_in(s[i]);

然后题目每次询问给定一个字符串 \(t\),问其是几个字符串的前缀,我们在建立树时记录了一个 cnt 数组,表示其子树大小,我们按照树的路径取寻找字符串 \(t\) 的位置,然后看这个位置的子树大小就知道答案了。

int find(string & s){
	int now=0;
	for (int i=0;i<s.size();i++){
		int t=getid(s[i]);
		if(nxt[now][t]==-1)return 0;
		now=nxt[now][t];
	}
	return cnt[now];
}

最后就是一些杂碎的输入输出了,我贴上完整代码加注释:

#include<bits/stdc++.h>
using namespace std;
int all,n,q;
string s[100005];
int nxt[3000006][70];
int cnt[3000006];
int getid(char c){
	if(c>='0'&&c<='9')return c-'0';//数字编号0-9
	else if(c>='a'&&c<='z')return c-'a'+10;//小写字母编号10-35
	else return c-'A'+36;//大写字母编号36-61
}
void push_in(string & s){//建立字典树
	int now=0;
	for(int i=0;i<s.size();i++){
		cnt[now]++;//子树节点个数+1
		int t=getid(s[i]);//给字符编号
		if(nxt[now][t]==-1) {//没有这个分支就开设一条
			nxt[now][t]=++all;
		}
		now=nxt[now][t];//循着前“人”开设的路径找
	}
	cnt[now]++;
}
int find(string & s){//搜寻答案
	int now=0;
	for (int i=0;i<s.size();i++){
		int t=getid(s[i]);
		if(nxt[now][t]==-1)return 0;//找不到这个字符串
		now=nxt[now][t];//循着路径找
	}
	return cnt[now];//返回子树大小
}
int main(){
	int t;cin>>t;
	while(t--){//多组测试数据
		cin>>n>>q;
		int kkk=0;
		for(int i=1;i<=n;i++){
			cin>>s[i];//读入
			kkk+=s[i].size();//计算总长度
		}
		for (int i=0;i<=kkk+10;i++){//清空
			cnt[i]=0;
			for(int j=0;j<=62;j++){
				nxt[i][j]=-1;
			}
		}
		for(int i=1;i<=n;i++){//建树
			push_in(s[i]);
		}
		while(q--){
			string o;cin>>o;
			cout<<find(o)<<endl;
		}
		all=0;
	}
	return 0;//完美结束!!
}

标签:P8306,string,int,字符串,模板,字典
From: https://www.cnblogs.com/StudytoFLY/p/17994408

相关文章

  • 算法模板 v1.4.2.20240129
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • Prometheus 主机监控管理模板
    systemd管理node_exporterhttps://prometheus.io/download/#node_exporterwgethttps://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz~]#tar-xfnode_exporter-1.7.0.linux-amd64.tar.gznode_exporter-1.7.......
  • C++类模板
    1.类模板作用:建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表语法:template<typenameT>类解释:template-声明创造模板typename-表面其后面的符号是一种数据类型,可以用class代替T-通用的数据类型,名称可以替换,通常为大写字母二.类模板和函数模......
  • 【秀米教程9】制作专属秀米模板,更加适应你的工作内容
    你是否想在秀米中拥有自己的专属模板呢?你是否想更快捷的完成工作然后摸鱼呢?你是否经常用一些特定的模板呢?一起来看看......
  • 算法模板 v1.4.1.20240128
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • Vue模板语法——数据绑定指令
    一、数据绑定指令v-text填充纯文本相比插值表达式更加简洁v-html填充HTML片段存在安全问题本网站内部数据可以使用,来自第三方的数据不可以用v-pre填充原始信息显示原始信息,跳过编译过程(分析编译过程)二、v-text填充纯文本v-text用法在需填充的标签中添加......
  • Vue模板语法——v-once 数据响应式
    一、数据响应式如何理解响应式html5中的响应式:屏幕尺寸的变化导致样式的变化数据的响应式:数据的变化导致页面内容的变化什么是数据绑定数据绑定:将数据填充到标签中v-once只编译一次显示内容之后不再具有响应式功能二、v-once指令v-once应用场景如果显示的......
  • Vue模板语法——v-model 双向数据绑定
    双向数据绑定单向数据绑定是什么?数据模型(Module)和视图(View)之间的单向绑定。需要我们先写好模板,然后把模板和数据(可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面。简单的来说就是DOM操作html元素。单向数据绑定的缺点:一旦HTML代码生成好后,就没有办......
  • Vue模板语法——v-on 事件绑定
    一、v-on事件绑定v-on指令用于绑定事件v-on用法转=>最底层的技术渣--Vue基础语法之v-on转=>一瓶怡宝矿泉水--v-on指令直接绑定事件:注意:绑定的事件是对应的方法不是定义在data里面,而是定义在vue实例的methods里绑定的函数可直接绑定函数名——fun,也可以直接调用......
  • Vue模板语法——键盘事件修饰符
    一、键盘修饰符在JavaScript事件中除了前面所说的事件,还有键盘事件,也经常需要监测常见的键值。在Vue中允许v-on在监听键盘事件时添加关键修饰符。记住所有的keyCode比较困难,所以Vue为最常用的键盘事件提供了别名:enter:回车键tab:制表键delete:含delete和backspace键esc:返回键......