提高组模拟赛 39 B. 任务 题解

news/2025/10/29 7:03:24/文章来源:https://www.cnblogs.com/HirasawaYuii/p/19173074

提高组模拟赛 39 B. 任务 题解

题目链接

题意略

对于单个任务,显然为求子串长为 \(len=s.size()\) 长度为 \(a_i\) 的串(以下简称大串与小串)的数量,而且显然这与串的内容无关

这么多显然其实是我懒得讲了

继续上面的,设 \(f_{i,j}\)\(len=i,a_i=j\) 且大串最后一位恰好为小串的最后一位时的数量,暴力来说有一个显然的推导式

\[f_{i,j}=f_{i-1,j}\times25+f_{i-1,j-1} \]

所以总数量为 \(\sum_{k=j}^{i}f_{i,k}\),即对于 \(j\) 做一个后缀和

赛时代码:

f[0][0] = 1;
for(ll i = 1; i <= 100000; i++) {f[i][0] = f[i-1][0]*25ll%M;for(ll j = 1; j <= 1000; j++) {f[i][j] = (f[i-1][j]*25ll+f[i-1][j-1])%M;}f[i][1000] = (f[i-1][1000]*26ll+f[i-1][999])%M;
}
for(int i = 1; i<= 100000; i++) for(ll j = 1000; j >= 0; j--) f[i][j] = (f[i][j]+f[i][j+1])%M;

这样预处理后,套上一个线段树进行单点修改区间查询可以得到 \(70pts\)

那对于正解,我们要引入一个新的推导式

\[f_{i,j}=C_{i-1}^{j-1}\times25^{i-j}+f_{i-1,j}\times26 \]

这个式子的推导也很显然,分别是第 \(j\) 位放最后一位和不放最后一位的两种情况

注意:这里的 \(f\) 直接为最终结果,即暴力式后缀和后的结果。且这里的 \(i,j\) 和官方题解定义是相反的

这个推导式对我们的求解有一个贡献:对于任意大串的长度和单个小串的长度,其答案对于小串长是独立的,即只从 \(f_{i-1,j}\) 转移,与 \(j-1\) 无任何关系

同时注意到,\(\sum_{len}=3\times10^5\),所以不同的小串长只有 \(\sqrt{6\times10^5}=774\) 中,这里我看有很多人不明白是啥意思,因为是不同的小串长,所以最坏情况其实就是等差数列 \(1+2+...+maxlen=3\times10^5\) 的形式。

所以对于每个小串长,我们跑一次对于任意 \(i\) 的所有情况即可。

时间复杂度为带有很多常数的 \(O(n\log n)\)

哦对了,这题需要挺多时间和空间的卡常。首先,\(f\) 数组得开 int,计算时用 1ll 强转类型即可,不然会爆。还有需要预处理 \(25^x\)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define mst(x, y) memset(x, y, sizeof(x))
#define pii pair<ll, ll>
#define fi first
#define se second
#define mp(x, y) make_pair(x, y)
#define eb emplace_back
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)inline ll rd(){ll x = 0, f = 1;char c = getchar();while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();}return f*x;}
inline void writ(ll x){if(x < 0){putchar('-');x = -x;}if(x > 9) writ(x/10);putchar(x%10 | 0x30);return;}
inline void wr(ll x){writ(x);puts("");}
inline void wr_(ll x){writ(x);putchar(' ');}
const ll N = 2e5+5, M = 998244353, inf = 0x3f3f3f3f;bool st;
ll n, q, cnt;
ll len[N], a[N], inv[N], finv[N], jc[N], id[N], rev[N];
int f[N][800], pow25[N];
struct SegTre {ll val[N<<2];void build(ll p, ll l, ll r) {if(l == r) {if(a[l] < len[l]) val[p] = 0;else val[p] = f[a[l]][id[len[l]]];return;}ll mid = (l+r) >> 1;build(ls(p), l, mid);build(rs(p), mid+1, r);val[p] = 1ll*val[ls(p)]*val[rs(p)]%M;}void modify(ll p, ll l, ll r, ll x, ll v) {if(l == r) {if(v < len[l]) val[p] = 0;else val[p] = f[v][id[len[l]]];return;}ll mid = (l+r) >> 1;if(x <= mid) modify(ls(p), l, mid, x, v);else modify(rs(p), mid+1, r, x, v);val[p] = 1ll*val[ls(p)]*val[rs(p)]%M;}ll query(ll p, ll l, ll r, ll L, ll R) {if(L <= l && r <= R) return val[p];ll mid = (l+r) >> 1, res = 1;if(L <= mid) res = query(ls(p), l, mid, L, R);if(mid < R) res = 1ll*res*query(rs(p), mid+1, r, L, R)%M;return res;}
}t;void allinv() {inv[0] = 1, jc[0] = 1, finv[0] = 1, pow25[0] = 1;inv[1] = 1, jc[1] = 1, finv[1] = 1, pow25[1] = 25;for(ll i = 2; i <= 100000; i++) {pow25[i] = pow25[i-1]*25ll%M;inv[i] = 1ll*(M-M/i)*inv[M%i]%M;jc[i] = 1ll*jc[i-1]*i%M;finv[i] = 1ll*finv[i-1]*inv[i]%M;}
}
ll C(ll n, ll m) {if(n < m) return 0;return 1ll*jc[n]*finv[m]%M*finv[n-m]%M;
}
void solve() {allinv();n = rd(), q = rd();for(ll i = 1; i <= n; i++) {string s;cin >> s;len[i] = s.size();if(id[len[i]] == 0) id[len[i]] = ++cnt, rev[cnt] = len[i];}for(ll i = 1; i <= n; i++) a[i] = rd();for(ll k = 1; k <= cnt; k++) {ll j = rev[k];for(ll i = j; i <= 100000; i++) {f[i][k] = 1ll*(1ll*C(i-1, j-1)*pow25[i-j]%M+f[i-1][k]*26ll%M)%M;}}t.build(1, 1, n);while(q--) {ll op = rd(), l = rd(), r = rd();if(op == 0) t.modify(1, 1, n, l, r);else wr(t.query(1, 1, n, l, r));}
}
bool ed;signed main() {freopen("task.in", "r", stdin);freopen("task.out", "w", stdout);ll T = 1;while(T--) solve();cerr << "Time :" << 1.0*clock() / CLOCKS_PER_SEC << "s\n";cerr << "Memory :" <<( (&ed-&st) / (1ll<<20) ) << "MB\n";return 0;
}

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

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

相关文章

ICPC2022西安 游记(VP)

$6t$ 铜首,然而距离银似乎仍旧遥远遥远。省流 \(6t\) 铜首,然而距离银似乎仍旧遥远。10.28 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 第一次和 chumeng 老师以及 qwsxza 老师组队打,想着可以抱大腿拿个…

使用空间关系匹配时候,由于视角遮挡和分割缺失导致检测不完整,从而影响了关系描述,如何解决? - MKT

使用空间关系匹配时候,由于视角遮挡和分割缺失导致检测不完整,从而影响了关系描述,如何解决?这是一个非常深刻且实际的问题!​​视角遮挡和分割缺失​​确实是基于空间关系匹配(无论是2D图像还是3D场景图)的最大…

语义slam Kimera - MKT

语义slam Kimera好的,我们来详细解析 ​​Kimera​​。这是一个在机器人领域非常有影响力的开源项目,它提供了一个完整、鲁棒且实时的​​空间感知​​系统。Kimera 的核心思想非常优雅:​​将 SLAM 的几何重建与…

高效CLI应用质量检测工具

本项目提供自动化脚本工具,用于检测Awesome CLI应用列表中的项目状态,识别已归档的GitHub仓库和失效链接,确保列表始终保持最新和可用状态。CLI应用质量检测工具 项目描述 这是一个专门用于检测Awesome CLI应用列表…

ICPC2025成都 游记

从失败到失败,我是打铁大王吧。省流 从失败到失败,我是打铁大王吧。10.27 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 省略一些与比赛无关的东西,只剩下了两件事。一个是赛前几天基本没做题没复习还自我感…

应用安全 --- vmp流程

应用安全 --- vmp流程VMP (2.0.3-2.13) 寻找OEP详细教程 📋 前置准备工具: OllyDbg / x64dbg / IDA Pro 插件: OllyDumpEx、Scylla(用于后续dump) 目标: 被VMP保护的程序🎯 方法一:VirtualProtect断点法(经典方…

语言-地图slam ConceptGraphs: Open-vocabulary 3D scene graphs for perception and planning, - MKT

语言-地图slam ConceptGraphs: Open-vocabulary 3D scene graphs for perception and planning,ConceptGraphs: Open-vocabulary 3D scene graphs for perception and planning,好的,​​ConceptGraphs​​ 这篇论文…

语义slam Fusion++ - MKT

语义slam Fusion++ 2. Fusion++的核心思想:范式转变 Fusion++彻底改变了游戏规则。它不再将世界看作一个统一的几何空间,而是将其看作由​​背景​​和​​多个独立的物体实例​​组成的集合。 思想一:实例级表示…

点云配准 Deep closest point: Learning representations for point cloud registration, - MKT

点云配准 Deep closest point: Learning representations for point cloud registration,

tryhackme-网络安全基础-命令行- Linux Shells-23

tryhackme-Cyber Security 101-Command Line-Linux Shells 房间地址:https://tryhackme.com/room/linuxshells 这是网络安全入门的基础模块的计算机科学基础知识:Linux Shells,序号 01 表示第一篇文章,当你不知道从…

开发Minecraft Forge模组遇到的问题记录

开发工具:IDEA 2022.2.5 JDK:21.0.7 Forge:60.0.11 这里一定要清楚这些版本号,很多问题都是因为版本不兼容引起的,所以先声明使用工具的版本号,接下来踩坑开始(遇到的坑大概率会按照逻辑的先后顺去说明,而不是…

【ESP32 在线语音】 待写 TTS

链接:https://blog.csdn.net/vor234/article/details/138387195?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522dac311b95071f02fedec5ea5a048fdf6%2522%252C%2522scm%2522%253A%252220140713.130102334…

Fusion++ 语义实例分割​​与​​稠密SLAM重建​​在TSDF子图层面进行了深度融合 - MKT

Fusion++ 语义实例分割​​与​​稠密SLAM重建​​在TSDF子图层面进行了深度融合 3. Fusion++ 的完整工作流程 ​​步骤一:基于RGB-D帧的实例分割(每帧)​​输入每一帧RGB-D图像。 使用2D实例分割网络(如Mask R-C…

tryhackme-网络安全基础-命令行- Windows PowerShell-22

tryhackme-Cyber Security 101-Command Line-Windows PowerShell 房间地址:https://tryhackme.com/room/windowspowershell 这是网络安全入门的基础模块的计算机科学基础知识:Windows PowerShell,序号 01 表示第一篇…

【ESP32 在线语音】音频接收的缓存机制和网络发送机制

首先是初始化 I2S 设备中,可能用到了缓存 //初始化 I2S 设备 INMP441Serial.println("Setup I2S ...");i2s_install();i2s_setpin();esp_err_t err = i2s_start(I2S_PORT_0);其中的 i2s_install() 配置了 …

XCPC英语学习day2

2024ICPC昆明 A. Antivicus 在介绍网络流的时候,几乎还没开始讲,pet chicken指出如何解决这个问题。老师惊呼:我们的禽流感太棒了。 ——Roasted-chicken Htrule进入了流感季。 Hyrule由n个城市组成,由m条有向道路…

2025年PFA隔膜阀厂家权威推荐榜:耐腐蚀高纯流体阀门专业制造商,精选PFA/四氟阀门优质品牌解析

2025年PFA隔膜阀厂家权威推荐榜:耐腐蚀高纯流体阀门专业制造商,精选PFA/四氟阀门优质品牌解析 行业背景与发展现状 在半导体制造、生物医药、精细化工等高技术领域,高纯流体输送系统的可靠性与洁净度直接关系到产品…