24迎新马拉松——字典

news/2024/11/18 5:01:10/文章来源:https://www.cnblogs.com/kklxy/p/18291709

思路

这道题我们可以把每个单词正过来放在一个字典树里。

而我们把每个单词反过来,给每个单词单独建立一个字典树。

而询问要求的就是前缀在正串的字典树上的那个节点为根的子树中,所有串的反串字典树合并之后的那个字典树上,后缀的那个节点所对应的子树当中有多少个串就是答案。

举个小例子:

现在有 \(n\) 个单词。

分别是:“abc”,“ab”,“bac”,“bab”和“cbc”。

正串的字典树为:

反串的若干个字典树:

如果我们这时候要查询前缀为a,后缀为c的词有多少个,那么我们先去正串的字典树上找到对应的点。

然后我们把他子树内反串的字典树合并。

然后走后缀为c,发现他的子树中就只有一个串,答案就是一。

核心代码:

inline ll insf(string &s) {reverse(s.begin(), s.end());ll p = ++ftot;ll rt = p;sz[ftot] = 1;for (auto i : s) {p = ft[p][i - 'a'] = ++ftot, sz[ftot] = 1;}reverse(s.begin(), s.end());return rt;
}
inline ll merg(ll a, ll b) {if (!a) {return b;}if (!b) {return a;}sz[a] += sz[b];rep(i, 0, 25) {ft[a][i] = merg(ft[a][i], ft[b][i]);}return a;
}
string s[N];
struct node {string ht;
} ask[N];
ll ans[N];
inline void addtag(string &s, ll id) {ll p = 0;for (auto i : s) {ll v = i - 'a';if (!t[p][v]) {return ;}p = t[p][v];}g[p].push_back(id);
}
inline ll query(ll p, string &s) {for (auto i : s) {ll v = i - 'a';if (!ft[p][v]) {return 0;}p = ft[p][v];}return sz[p];
}
ll dd[N];
inline void dfs(ll x) {if (!wei[x]) {dd[x] = ++ftot;} else {dd[x] = rt[wei[x]];}rep(i, 0, 25) {if (t[x][i]) {dfs(t[x][i]);merg(dd[x], dd[t[x][i]]);}}
//	cout << x << " ";for (auto v : g[x]) {
//		cout << v << " ";ans[v] = query(dd[x], ask[v].ht);}
//	cout << "\n";
}

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

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

相关文章

香橙派5plus上跑云手机方案二 waydroid

前言 上篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)说了怎么跑带GPU加速的redroid方案,这篇说下怎么在香橙派下使用Waydroid。 温馨提示 虽然能运行,但是体验下来只能用软件加速,无法使用GPU加速,所有会很卡。而且Waydroid还依赖于桌面环境wayland,要么插上显…

弹性伸缩落地实践

1. 什么是 HPA ? HPA(Horizontal Pod Autoscaler)是 Kubernetes 中的一种资源自动伸缩机制,用于根据某些指标动态调整 Pod 的副本数量。 2. 什么时候需要 HPA ?负载波动:当您的应用程序的负载经常发生波动时,HPA 可以自动调整 Pod 的副本数量,以适应负载的变化。例如,…

三星 NAND FLASH命名规范 Samsung NAND Flash Code Information

一共有三页,介绍了前面主要的编号和横杠后面的编号,当前文档只关注前面的编号。 从前面的命名规范中可以得知当前芯片的容量、技术等概要信息,对芯片有一个整体了解。 详细解释 Small Classification 表示存储单元的类型和应用,比如 SLC 1 Chip XD Card 表示是SLC的,包含1…

[转]ZeroMQ用法说明及C++示例

原文链接:https://blog.csdn.net/qq_40344790/article/details/130865273ZMQ介绍 官网:https://zeromq.org/ Github:https://github.com/zeromq/libzmq ZMQ(ZeroMQ)是一种高性能的异步消息传递库,它可以在不同的进程和机器之间进行消息传递。它提供了多种传输协议、通信模…

Solidity:assembly

在Solidity中,assembly是一个内嵌的低级语言,它允许开发者直接编写EVM(以太坊虚拟机)字节码。这种能力使得开发者可以更精细地控制智能合约的行为,并且在某些情况下可以提高性能和减少gas费用。然而,使用assembly也增加了代码的复杂性和出错的可能性,因此应谨慎使用。 为…

K8s 驱逐场景以及规避方案

Pod 驱逐场景总结从一个 SRE 角度看, Pod 驱逐分为两种情况:较安全驱逐 & 提高稳定性的良性驱逐API 发起驱逐,典型案例:kubectl drain Node Not Ready 时,Controller Manager 发起的驱逐有风险的驱逐节点压力驱逐节点磁盘空间不足、内存不足 或 Pid 不足, kubelet 发…

[二、状态管理]1状态管理概述

在前文的描述中,我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念。 图1 效果图上面的示例中,用户与应用程序的交互触发了文本状态变更,状态变更引起了UI渲染,UI从“Hello World”变更为“Hello ArkUI”。 在声明式UI编程框架…

lazarus 项目用到的控件

官网 https://www.lazarus-ide.org/ 基本上都是原生插件,能同时满足WINDOWS和Linux下开发 用到的控件

设置npm的registry几种方法

https://www.cnblogs.com/luludehuhuan/p/8017014.html相信坚持的力量,日复一日的习惯.

Etcd 高可用故障演练

目的 本次演练旨在测试 Kubernetes 的 etcd 高可用性,检验是否能够在其中一个 etcd 节点发生故障的情况下,其他 etcd 节点能够接管其工作,确保集群仍能正常运行。 集群架构演练场景 在一个三节点的 Kubernetes 集群中,我们将模拟其中一个 etcd 节点的故障,观察剩余的 etcd…

会计工作的关键一步——用免费可视化工具制作财务报表

会计工作中,关键一步就是把那些繁杂的财务数据整理成清晰易懂的财务报表,这就像是把一堆拼图块变成一幅完整的图画。山海鲸可视化这款免费工具,支持实时数据刷新,能够随时随地更新你的财务数据,确保你拿到的永远是最新鲜的“出炉”数据。操作也非常简单,零代码拖拽式界面…

JVM是如何创建一个对象的?

1. Java对象创建的流程是什么样? 2. JVM执行new关键字时都有哪些操作? 3. JVM在频繁创建对象时,如何保证线程安全? 4. Java对象的内存布局是什么样的? 5. 对象头都存储哪些数据?哈喽,大家好🎉,我是世杰。 本文我为大家介绍面试官经常考察的「Java对象创建流程」照例在…